При использовании BigDecimal вместо double, почему в строке 8 отображается 0.01, а в строке 4 - 0.009999999999999998?
double a = 0.02;
double b = 0.03;
double c = b - a;
System.out.println(c); // line #4 prints 0.009999999999999998
BigDecimal _a = new BigDecimal("0.02");
BigDecimal _b = new BigDecimal("0.03");
BigDecimal _c = _b.subtract(_a);
System.out.println(_c); // line #8 prints 0.01
что не так с 0.009999999999999998 ?? мне кажется 0,01 :)
@RAZ_Muh_Taz Это имеет значение в финансовых расчетах, анализе цен на акции, анализе цен на газ, вычислении высоты для самолетов и т. д. В некоторых других сценариях это не имеет значения.




Это случилось со мной когда-то назад, когда я работал в финансовой фирме, и разница в 1 цент в расчетах заставила меня работать все выходные.
Все зависит от того, как числа с плавающей запятой (которые состоят из двух частей - мантиссы и экспоненты) хранятся на оборудовании и всегда имеют свойство точности.
двойники страдают одним и тем же свойством точности (указывающим, насколько точно оно представлено).
BigDecimal является точным представлением чисел с плавающей запятой и не имеет precision. Итак, для любых финансовых расчетов BigDecimal - это путь, где разница в 0,0001 имеет значение. При этом он медленнее по сравнению с использованием double.
Вы должны прочитать BigDecimal javadoc, это будет хорошее чтение и просветит вас.
См. Также: stackoverflow.com/questions/3413448/double-vs-bigdecimal