число с плавающей запятой не является ожидаемым числом после вычитания

У меня есть следующее утверждение:

float diff = tempVal - m_constraint.getMinVal();

tempVal объявлен как поплавок иgetMinVal() возвращает значение с плавающей точкой.

У меня есть следующая распечатка:

diff = 0.099999905, tempVal = 5.1, m_constraint.getMinVal () = 5.0

Я ожидаюразница является0,1 но не вышеуказанный номер. как это сделать?

 Mysticial07 нояб. 2012 г., 06:33

Ответы на вопрос(4)

используя двоичные представления с плавающей точкой, определенные вIEEE 754, Как и все конечные представления, он не может точно представлять все действительные числа, потому что вещественных чисел гораздо больше, чем потенциальных представлений. Числа, которые не могут быть представлены точно (например, 0,1 в вашем случае), округляются до ближайшего представимого числа.

exact результаты сfloatномера точек. Возможно, вам придется использовать библиотеку FixedPoint для этого. Увидеть :http://sourceforge.net/projects/jmfp/

что они хранят значения внутри, числа с плавающей запятой и двойники могут хранить абсолютно точно только числа, которые можно разложить на сумму степеней 2 (и затем, в рамках определенных ограничений, связанных с их абсолютной и относительной величиной).

Поэтому, как только вы попытаетесь сохранить или выполнить вычисление с использованием числа, которое не может быть сохранено точно, вы получите ошибку в последней цифре.

Обычно это неt проблема, если вы используете поплавки и удваивается с некоторой предосторожностью:

использовать размер примитива с плавающей точкой, который имеет "запасной" цифры точности выше того, что вам нужно;

для многих приложений это, вероятно, означаетдон»не использовать поплавок на всех (используйте вместо этого double): он имеет очень плохую точность и, за исключением деления, не дает выигрыша в производительности на многих процессорах;

при печати чисел FP только печатайте и учитывайте количество нужных вам цифр и, конечно же, не• включить последнюю цифру (используйте String.format, чтобы помочь вам);

если вам нужно произвольное количество цифр точности, используйте вместо этого BigDecimal.

Решение Вопроса

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

Гид с плавающей точкой

Что каждый ученый должен знать об арифметике с плавающей точкой

Википедия на IEE754

Итог, если вы делаете арифметику, и это должно быть точно нет использоватьfloat или жеdouble кроме насBigDecimal

Ваш ответ на вопрос