Проверьте Multiple и модуль двух BigDecimal в Java - PullRequest
0 голосов
/ 05 сентября 2018
BigDecimal x = new BigDecimal(1.95);
BigDecimal y = new BigDecimal(0.65);

BigDecimal rem = x.remainder(y);
if (rem.compareTo(BigDecimal.ZERO) != 0.) {
    System.out.println("Not In mutilple of");
} else {
    System.out.println("In mutilple of");
}
System.out.println(rem);

Не дает правильного результата для вышеуказанного сценария. учитывая условие ввода, но дает неверный результат, если он кратен второму значению

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Объяснение

Использование 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
0 голосов
/ 05 сентября 2018

Инстанцировать как

BigDecimal x= new BigDecimal("1.95");
BigDecimal y= new BigDecimal("0.65");

, поскольку не все числа с плавающей точкой могут быть представлены в точности как double с.

Вывод в вашем коде показывает 0.65 сс 0.64999999999999995559107901499373838305473327636718750

см. https://study.com/academy/lesson/java-floating-point-numbers.html

...