Действует ли Math.floor как Math.round в ActionScript 3? - PullRequest
3 голосов
/ 07 марта 2011

Вот проблема:

var p:int = 0;
var n:Number = 0;
n = 32.999999999999999;
p = Math.floor(n);
trace(p); // returns 33 
n = 32.11111111111111;
p = Math.floor(n);
trace(p); // returns 32

Я ожидаю, что оба из них вернут 32. Я искал, и кажется, что это не сообщенная ошибка в AS3.Или ... я что-то не так делаю?

Ответы [ 3 ]

5 голосов
/ 07 марта 2011

Прежде всего, это не ошибка !!!

Вы используете тип числа double - [Стандарт IEEE для арифметики с плавающей точкой (IEEE 754)] [1]. Это означает, что у вас нет точных чисел, но приблизительные числа близки к точному значению.

Например, если вы хотите добавить или вычесть наименьшее возможное значение к двойному значению мантиссы вокруг числа 33, тогда вы получите значения:

32.999999999999986
32.99999999999999
33.0
33.00000000000001
33.000000000000014

Это, по сути, самые близкие значения около 33, которые могут иметь двойные значения. Если вы не заметили разницу, то

32.99999999999999     // closest lower
32.999999999999999    // input value
33.0                  // closest higher

Теперь 32.999999999999999 становится 33.0, когда код интерпретируется или анализируется как число. Таким же образом, если вы напечатаете 32.9999999999999879, вы получите 32.999999999999986 - double просто не имеет битов для сохранения этой дополнительной точности, и он будет заменен на ближайшее значение. Обратите внимание, что это не арифметически ближе всего, но, как это определено в стандарте.

Предлагаемое чтение: http://en.wikipedia.org/wiki/Machine_epsilon

1 голос
/ 07 марта 2011

Как и предполагали другие, это не ошибка. Если у вас n = 32.999999999999996, он округляется до 32. Если у вас n = 32.999999999999997, то он такой же, как n = 33, поэтому он не может на самом деле округляться.

1 голос
/ 07 марта 2011

Вы только что столкнулись с явлением, которое в той или иной степени поражает все языки. Числа с плавающей точкой действительно трудно представить в двоичном виде, и поэтому вы можете потерять точность при их использовании.

var p:int = 0;
var n:Number = 0;
n = 32.999999999999999;
p = Math.floor(n);
trace(p); // returns 33 

Базовый компьютер считывает n равным 33 в этом случае задолго до того, как вы попытаетесь вызвать Math.floor.

Для получения дополнительной информации см. Эта статья в Википедии о Плавающей Точке, в разделе о точности

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