double check =0.615 * 255 -0.515 * 255 -0.100 * 255;
System.out.println(check);
Зачем получать -2.8421709430404007E-14? она должна быть 0,0распечатать двойной номер в java и получить неправильный ответ
double check =0.615 * 255 -0.515 * 255 -0.100 * 255;
System.out.println(check);
Зачем получать -2.8421709430404007E-14? она должна быть 0,0распечатать двойной номер в java и получить неправильный ответ
Двойная операция имеет некоторые проблемы с точностью. Используйте операцию BigDecimal вместо двойной, чем вы получите ожидаемый результат.
//double check =0.615 * 255 + -0.515 * 255 + -0.100 * 255;
BigDecimal check =
(BigDecimal.valueOf(0.615).multiply(BigDecimal.valueOf(255)))
.add(BigDecimal.valueOf(-0.515).multiply(BigDecimal.valueOf(255)))
.add(BigDecimal.valueOf(-0.100).multiply(BigDecimal.valueOf(255)));
System.out.println(check);
Результат: 0,000
большое вам спасибо – Rebecca
Отладка математику:
double check0 = 0.615 * 255;
System.out.println(check0);
double check1 = -0.515 * 255;
System.out.println(check1);
double check3 = -0.100 * 255;
System.out.println(check3);
System.out.println("Result: " + (check0 + check1 + check3));
Выход:
156.825
-131.32500000000002
-25.5
Result: -2.8421709430404007E-14
помнить, что:
BigDecimal
, если yo u хотите контролировать округление при выполнении операций с номерами с плавающей запятой, но check2 должен быть 131.325, но не 131.3250000000002 – Rebecca
@Rebecca именно поэтому вы хотите использовать 'BigDecimal' вместо' double' в этом случае. Также проверьте [this] (http://stackoverflow.com/questions/322749/retain-precision-with-doubles-in-java) SO-страницу, чтобы начать работу на хау и whys. – Mena
BigDecimal - ответ, спасибо !!! – Rebecca
http://stackoverflow.com/a/177512/887149 видеть это сообщение – Mohayemin
@JunedAhsan потому что при использовании расчета для расчета должно быть 0, причиной 156.825- 131.325-25.5 = 0 – Rebecca