Ошибка при добавлении 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

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

Любой обходные пути?

[UX] Категории и настройки внешнего вида Flash-сообщений
[UX] Категории и настройки внешнего вида Flash-сообщений
Flash-сообщение - это обычный веб-элемент, используемый для отправки короткого сообщения пользователю. Например, на странице входа в систему может...
1
0
861
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

trace (round (a, 1))

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

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

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

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

Другие вопросы по теме