Хорошо, это не столько вопрос Flex, сколько вопрос общего программирования. Задумывались ли вы, как именно цифры хранятся в компьютере? Подробности в математике, но я постараюсь выразиться проще. Вы знаете, что существует бесконечное количество различных действительных чисел (например, одинаковых точек на непрерывной линии), но на вашем компьютере вы храните все как нули и единицы, а их ограниченное количество (32 или 64 «бита»). Так что теперь у нас есть проблема - как представить неограниченное количество чисел в ограниченном пространстве. Идея, используемая в числе с плавающей запятой (те, которые могут иметь значения с «точкой», такой как 1.03 или 4.2232), заключается в том, что, поскольку вы не можете иметь их все, вы округляете число до ближайшего к вам.
Это немного похоже на воспоминание о том, сколько сахара кто-то кладет в свой кофе, вы не помните, что ему нравится иметь 1.1232 столовых ложки сахара, потому что столовая ложка просто не так хороша в измерении точного количества продуктов на Это. Вы округляете его до одного, и он работает нормально большую часть времени.
Так что с числами с плавающей запятой стоит похожая идея, с дополнительным поворотом - числа гораздо плотнее около 0, чем далеко от него, где «пустое пространство» между ними становится действительно большим. Например, если вы вычтете 10000 из максимального значения, которое может получить число, оно все равно останется тем же, потому что нет такого номера, который был бы настолько близок к нему, чтобы иметь значение при поиске ближайшего.
trace (Number.MAX_VALUE == Number.MAX_VALUE-10000);
// returns "true"
trace (200000 == 200000 - 10000);
// returns "false"
Итак, ваша проблема заключается в предположении, что числа абсолютно точны, а они нет, вы всегда округляете. Число в as3 соответствует стандарту IEEE-754 двойной точности, и именно так оно решает, какое число оно имеет, а какое округляет.
Посмотрите на это:
trace (8244.094488188976);
// returns "8244.094488188975"
Дальнейшее чтение:
Плавающая точка
IEEE_754-2008