Арифметическое выражение вычисляет 6.135157E-6 вместо нуля - PullRequest
2 голосов
/ 06 февраля 2012

У меня есть код ниже в моем приложении

float private myMethod(float c){
    result = (float) (c+273.15);
}

Когда "c" получает значение, например, -273.1455, результат очень близок к нулю, например, 0,0044.

Но когда он получает значение -273,15, я получаю это вместо нуля: 6.1035157E-6

Почему это происходит?

Ответы [ 3 ]

6 голосов
/ 06 февраля 2012

Проблема в том, что 273.15 - это двойное число, а не число с плавающей запятой, и ни один из них не может точно представлять 273.15. Однако, поскольку они имеют разную точность, они на самом деле будут хранить разные числа. Когда сложение завершено, c преобразуется в double, который сможет хранить представление с плавающей точкой 273.15. Так что теперь у вас есть два двойных с почти одинаковым значением, и разница будет отлична от нуля.

Чтобы получить «более предсказуемый» результат, используйте 273.15f, чтобы убедиться, что у вас есть плавающие результаты вычислений. Это должно решить эту проблему, но вам нужно прочитать двоичную арифметику с плавающей запятой и узнать, чем она отличается от десятичной арифметики, которой нас учат в школе.

Вики с плавающей запятой хорошее место для начала.

2 голосов
/ 06 февраля 2012

Расчеты с плавающей точкой в ​​компьютерах не точны.Вы должны прочитать кое-что об арифметике с плавающей запятой, чтобы предотвратить такие ошибки.

0 голосов
/ 06 февраля 2012

Проблема не со значением, а с отображением для пользователя.

Я предполагаю, что вы конвертируете его в строку.Как это сделать, подробно описано в http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Double.html#toString(double)

. Для отображения правильного значения используйте класс NumberFormat http://docs.oracle.com/javase/1.4.2/docs/api/java/text/NumberFormat.html

Пример:

NumberFormat formater = NumberFormat.getNumberInstance()
formatter.setMaximumFractionDigits(4);
formater.format(myMethod(-273.15))

Сейчасвы должны получить 0.

...