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

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

1 голос
/ 14 декабря 2008

Создайте новый документ 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

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

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

Ответы [ 2 ]

8 голосов
/ 14 декабря 2008

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

trace (round (a, 1))

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

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

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

0 голосов
/ 14 декабря 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...