Сначала сделайте это double .Никогда не используйте float , иначе у вас возникнут проблемы с утилитами java.lang.Math
.
Теперь, если вам случится заранее знать точность , которую вы хотите, и эторавен или меньше 15, тогда вашим 1010 * двойным s становится легко сказать, как себя вести.Проверьте ниже:
// the magic method:
public final static double makePrecise(double value, int precision) {
double pow = Math.pow(10, precision);
long powValue = Math.round(pow * value);
return powValue / pow;
}
Теперь, когда вы выполняете операцию, вы должны указать своему double результату поведения:
for ( double value = 0.0d; value < 1.0d; value += 0.1d )
System.out.println( makePrecise(value, 1) + " => " + value );
Вывод:
0.0 => 0.0
0.1 => 0.1
0.2 => 0.2
0.3 => 0.30000000000000004
0.4 => 0.4
0.5 => 0.5
0.6 => 0.6
0.7 => 0.7
0.8 => 0.7999999999999999
0.9 => 0.8999999999999999
1.0 => 0.9999999999999999
Если вам нужна точность более 15, то вам не повезло:
for ( double value = 0.0d; value < 1.0d; value += 0.1d )
System.out.println( makePrecise(value, 16) + " => " + value );
Вывод:
0.0 => 0.0
0.1 => 0.1
0.2 => 0.2
0.3000000000000001 => 0.30000000000000004
0.4 => 0.4
0.5 => 0.5
0.6 => 0.6
0.7 => 0.7
0.8 => 0.7999999999999999
0.9 => 0.8999999999999999
0.9999999999999998 => 0.9999999999999999
NOTE1: Для производительности вам следуеткэшировать операцию Math.pow
в массиве.Здесь не сделано для ясности.
NOTE2: Именно поэтому мы никогда не используем double s для цен, но long s, где последний N (т.е. где N <= 15, обычно 8) цифр - десятичные цифры.Тогда вы можете забыть о том, что я написал выше:) </p>