2013-09-29 4 views
1
double check =0.615 * 255 -0.515 * 255 -0.100 * 255; 
System.out.println(check); 

Зачем получать -2.8421709430404007E-14? она должна быть 0,0распечатать двойной номер в java и получить неправильный ответ

+0

http://stackoverflow.com/a/177512/887149 видеть это сообщение – Mohayemin

+0

@JunedAhsan потому что при использовании расчета для расчета должно быть 0, причиной 156.825- 131.325-25.5 = 0 – Rebecca

ответ

3

Двойная операция имеет некоторые проблемы с точностью. Используйте операцию 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

+0

большое вам спасибо – Rebecca

1

Отладка математику:

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 

помнить, что:

  • умножение имеет более высокий приоритет оператора, чем сложение в Java
  • вы следует использовать BigDecimal, если yo u хотите контролировать округление при выполнении операций с номерами с плавающей запятой
+0

, но check2 должен быть 131.325, но не 131.3250000000002 – Rebecca

+0

@Rebecca именно поэтому вы хотите использовать 'BigDecimal' вместо' double' в этом случае. Также проверьте [this] (http://stackoverflow.com/questions/322749/retain-precision-with-doubles-in-java) SO-страницу, чтобы начать работу на хау и whys. – Mena

+0

BigDecimal - ответ, спасибо !!! – Rebecca

Смежные вопросы