2008-12-14 4 views
1

Сделать новый 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 

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

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

ответ

8

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

trace (round (a, 1)) 

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

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

См., Например, Why do I see a double variable initialized to some value like 21.4 as 21.399999618530273? или Strange floating-point behaviour in a Java program или What is a simple example of floating point/rounding error?.

0

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

Смежные вопросы