Баг в javascript

Тема в разделе "Другие языки", создана пользователем stealthdebuger, 9 июн 2011.

Модераторы: Цукер
  1. stealthdebuger

    stealthdebuger Механик

    Administrator
    Регистр.:
    25 авг 2008
    Сообщения:
    634
    Симпатии:
    1.407
    Случайно обнаружил непонятный баг в javascript.

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

    horpah

    Регистр.:
    21 июн 2010
    Сообщения:
    199
    Симпатии:
    55
    Код:
    <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()^
    http://javascript.ru/Number/toFixed
     
  3. zzzkabanzzz

    zzzkabanzzz Создатель

    Регистр.:
    15 июн 2011
    Сообщения:
    56
    Симпатии:
    4
    Все таки лучше использовать round! Насколько я понял нужно получить целое число, а раунд наиболее лучший метод!
     
  4. kos1986

    kos1986 Постоялец

    Регистр.:
    29 окт 2007
    Сообщения:
    118
    Симпатии:
    61
    Все числа в javascript хранятся в формате float64, т.е 8 байт с плавающей точкой. В этом формате не всегда возможны точные вычисления. Есть еще метод toFixed, для округление до нужной точности после запятой.