числа с плавающей точкой свойственна неточность - множество рациональных чисел бесконечно, но с плавающей точкой Number
-s сохраняются на 64 бита, в соответствии со стандартом IEEE-754. Очевидно, что 64 бита не являются бесконечным числом бит, поэтому некоторые значения с плавающей запятой могут быть представлены точно, а другие - нет.
В общем, вы не можете полагаться на число с плавающей запятой, чтобы иметь то же точное значение, которое вы пытаетесь назначить ему.
var n:Number = 0.05;
будет переведена компилятором в представление с плавающей запятой в 0.05
и что может ввести ошибку округления.
При работе с числами с плавающей запятой вам обычно нужно использовать диапазон вокруг нужного числа, вместо того, чтобы проверять точное равенство. Так что вместо того, чтобы делать
if (n == 0.05) // this may or may not fail, based on rounding
вы должны сделать что-то вроде
if ((n > 0.04) && (n < 0.06)) // this will more likely work
Диапазон до вас - вы должны решить, сколько разница является приемлемым, когда вы делаете чек (здесь я использовал 0.01). Чем меньше диапазон, тем больше вероятность того, что вы столкнетесь с ошибками округления. Чем больше диапазон, вы получите все больше и больше неточных номеров, которые проходят проверку.
Вот довольно приличный article, который более подробно освещен. В Интернете также есть много ресурсов о том, как правильно работать с числами с плавающей запятой.
Ну, это определенно ошибка округления с плавающей точкой. – Iggy
https://ece.uwaterloo.ca/~dwharder/NumericalAnalysis/02Numerics/Double/paper.pdf (Есть * soo many * duplicates of this.) – user2864740
Возможный дубликат [Есть математика с плавающей запятой?] (Http: //stackoverflow.com/questions/588004/is-floating-point-math-broken) – user2864740