Ошибка в добавлении Flash

Создайте новый документ AS3 во Flash, вставьте следующий код и запустите его:

var a:Number=0;
trace(a)  //  0
a+=0.3;
trace(a)  //  0.3
a+=0.3;
trace(a)  //  0.6
a+=0.3;

trace(a)  //  0.8999999999999999
a+=0.3;
trace(a)  //  1.2
a+=0.3;
trace(a)  //  1.5
a+=0.3;
trace(a)  //  1.8
a+=0.3;
trace(a)  //  2.1
a+=0.3;
          //  ^ This is the output. Notice the inaccuracy starting from 0.9 / 0.89

Почему ошибка? Я просто делаю обычные дополнения с высоким разрешением.

Есть обходные пути?

14.12.2008 02:52:58
2 ОТВЕТА
РЕШЕНИЕ

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

trace (round (a, 1))

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

хотя я не знаю ActionScript. Тем не менее, это очень известная проблема, не ограниченная AS3.

Посмотрите, например, Почему я вижу двойную переменную, инициализированную для некоторого значения, такого как 21.4, как 21.399999618530273? или Странное поведение с плавающей точкой в ​​Java-программе, или Что является простым примером ошибки с плавающей запятой / округления? ,

8
23.05.2017 12:01:27

Одним из обходных путей является использование масштабированного целочисленного типа. В этом примере вы можете увеличить на 3, а затем разделить на 10 непосредственно перед выводом. Это позволяет избежать всех ошибок округления, присущих арифметике с плавающей запятой.

0
14.12.2008 06:08:01