Объяснение
Использование new BigDecimal(double)
может привести к потере точности, см. doc :
Результаты этого конструктора могут быть несколько непредсказуемыми. Один
Можно предположить, что написание нового BigDecimal (0.1) в Java создает
BigDecimal, который точно равен 0,1 (немасштабированное значение 1, с
шкала 1), но на самом деле она равна
0,1000000000000000055511151231257827021181583404541015625. Это потому, что 0,1 не может быть представлен точно как двойной (или, для этого
материи, как бинарная дробь любой конечной длины). Таким образом, значение
то, что передается конструктору, не совсем равно
0,1, несмотря на внешний вид.
и
BigDecimal x= new BigDecimal(1.95);
BigDecimal y = new BigDecimal(0.65);
System.out.println(x); // 1.9499999999999999555910790149937383830547332763671875
System.out.println(y); // 0.65000000000000002220446049250313080847263336181640625
Решение
Использование BigDecimal(String val)
:
Конструктор String, с другой стороны, совершенно предсказуем:
при написании нового BigDecimal ("0.1") создается BigDecimal, который точно
равен 0,1, как и следовало ожидать. Поэтому, как правило,
Рекомендуется использовать конструктор String вместо этого
один.
и
BigDecimal x = new BigDecimal("1.95");
BigDecimal y = new BigDecimal("0.65");
System.out.println(x); // 1.95
System.out.println(y); // 0.65
System.out.println(x.remainder(y)); // 0.00