2013-03-28 3 views
1

Недавно я работал над системой проверки, основанной на flex 3, и имел общую сумму заказа, которая для меня не имела смысла. Я добавлял промежуточный итог, стоимость доставки и налог. Все три значения были округлены до двух знаков после запятой, но мой ответ вообще не округлялся.дополнение в flex 3

После изучения того, что происходило, я обнаружил, что каждый раз, когда вы добавляете 0,95 и 0,15 вместо получения 1.1, вы получаете повторение 1.09999999. Начиная с вариаций этого не имеет значения, в моем первоначальном случае это было (17.95 + 5 + 1.15). Flex дал мне 24.09999.

Есть ли причина для этого? Я могу снова закончить окончательное число и получить правильный результат, но кажется странным, что такая базовая арифметика была бы неправильной. Благодарю.

+1

Вы, вероятно, лучше всего с помощью [toPrecision()] (http://help.adobe.com/en_US/FlashPlatform/reference /actionscript/3/Number.html?filter_flash=cs5&filter_flashplayer=10.2&filter_air=2.6#toPrecision()) по номеру. Это в значительной степени проблема на большинстве языков, которые специально не предназначены для хрустания чисел и связаны с тем, как это число хранится на компьютере. –

+0

Показать код. – JeffryHouser

ответ

0

Из-за того, как компьютеры обрабатывают числа с плавающей запятой, они часто бывают очень близкими, но не точно такими же введенными вами значениями. Число должно соответствовать фиксированному количеству бит, поэтому некоторая разрешающая способность теряется для компромиссов пространства. Это ограничение компьютеров, а не гибкость.
Довольно простое объяснение
http://joshblog.net/2007/01/30/flash-floating-point-number-errors/
Гораздо более подробные разъяснения https://en.wikipedia.org/wiki/Floating_point