Сделайте новый документ 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
Почему ошибка? Я просто делаю обычное добавление высокого разрешения.
Любой обходные пути?
![[UX] Категории и настройки внешнего вида Flash-сообщений](https://i.imgur.com/5LZljB8b.jpeg)
Это стандартная проблема с плавающей запятой. Двоичные числа с плавающей запятой не представляют полный диапазон десятичных чисел с идеальной точностью, вам нужно сделать что-то вроде
trace (round (a, 1))
или, что еще лучше, превратите его в строку и удалите все, что находится за первой дробной цифрой (поскольку результат округления также может быть нелегко представить в двоичном формате).
хотя я не знаю ActionScript. Тем не менее, это очень известная проблема, и она не ограничивается AS3.
См., Например, Почему я вижу двойную переменную, инициализированную некоторым значением, например 21,4, как 21.399999618530273? или Странное поведение с плавающей запятой в программе на Java или Каков простой пример ошибки с плавающей запятой / округления?.
Одно из решений - использовать масштабированный целочисленный тип. В этом примере вы можете увеличить на 3, а затем разделить на 10 непосредственно перед выводом. Это позволяет избежать всех ошибок округления, присущих арифметике с плавающей запятой.