Баг в javascript

stealthdebuger

Механик
Регистрация
25 Авг 2008
Сообщения
681
Реакции
1.688
Случайно обнаружил непонятный баг в javascript.

PHP:
<script>
var a = 1.14; (Для двух знаков после запятой действительно в диапазоне 1.09-1.16)
a = a*100;
alert(a); //Значение переменной a вовсе не 114, как следует ожидать.
</script>

В браузерах FireFox, Opera, Chrome результат будет равен 113.99999999999999.
InternetExplorer покажет результат 113.99999999999998.
 
Код:
<script>
var a = 1.14 ;
a = a*100;
alert(a.toFixed(3)); 
</script>
Дело в том, что любое дробное число в двоичном формате представлено не точно. Вспомним преревод из 2->10, а точнее его дробной части:

a*2^(-1)+b*2^(-2)+c*2(-3)....

Но поскольку количество разрядов на дробную часть ограничено, то появится погрешность и будет составлять 2^(-n).... Тут можно долго теоретизировать,но в итоге у нас есть метод у объекта toFixed(),ceil(),round() floor()^
 
Все таки лучше использовать round! Насколько я понял нужно получить целое число, а раунд наиболее лучший метод!
 
Все числа в javascript хранятся в формате float64, т.е 8 байт с плавающей точкой. В этом формате не всегда возможны точные вычисления. Есть еще метод toFixed, для округление до нужной точности после запятой.
 
Назад
Сверху