Проверьте Multiple и модуль двух BigDecimal в java

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);

Not giving correct result for the above scenario. given the input condition but giving incorrect result if it is in multiple of the second value

Каков правильный результат?

Andy Turner 05.09.2018 09:32

Правильный результат должен быть кратен, потому что моя цель - проверить, что 1,95 кратно 0,65.

Taher Mahodia 05.09.2018 09:33
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
426
2

Ответы 2

Создать как

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

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

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

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

Объяснение

Использование new BigDecimal(double) может привести к потере точности, см. док:

The results of this constructor can be somewhat unpredictable. One might assume that writing new BigDecimal(0.1) in Java creates a BigDecimal which is exactly equal to 0.1 (an unscaled value of 1, with a scale of 1), but it is actually equal to 0.1000000000000000055511151231257827021181583404541015625. This is because 0.1 cannot be represented exactly as a double (or, for that matter, as a binary fraction of any finite length). Thus, the value that is being passed in to the constructor is not exactly equal to 0.1, appearances notwithstanding.

и:

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):

The String constructor, on the other hand, is perfectly predictable: writing new BigDecimal("0.1") creates a BigDecimal which is exactly equal to 0.1, as one would expect. Therefore, it is generally recommended that the String constructor be used in preference to this one.

и

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

Строго говоря, точность теряется во время компиляции ... когда литерал преобразуется в значение с плавающей запятой IEE.

Stephen C 05.09.2018 09:35

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

Taher Mahodia 05.09.2018 09:48

@TaherMahodia - Что вы имеете в виду - пожалуйста, дайте образец

Scary Wombat 05.09.2018 09:53

@Scary Wombat Он также дает неверный результат для немасштабированного значения BigDecimal x = new BigDecimal (1.94999999999999995559107901499373838305473327636‌ 71875); BigDecimal y = новый BigDecimal (0,65000000000000002220446049250313080847263336181‌ 640625);

Taher Mahodia 05.09.2018 09:57

Я хочу проверить, что два больших десятичных числа кратны или нет

Taher Mahodia 05.09.2018 09:59

так что посмотри мой ответ

Scary Wombat 05.09.2018 10:01

Кстати, на машине @Sun / OS / Версия Java 0.65 становится 0.65000000000000002220446049250313080847263336181640625 на моем испытательном стенде, он становится 0.64999999999999995559107901499373838305473327636718750

Scary Wombat 05.09.2018 10:03

Другие вопросы по теме