Скорей всего особенность чисел с плавающей запятой.
Дело в том, что при кодировании некоторых чисел двоичный код получается бесконечным. Например 0.1 в двоичной системе — 0.0(0011). В памяти компьютера это будет 1.1001100110011001100110011001100110011001100110011010b * 2^(-4), а при переводе в десятичную — 0.10000000000000000555111512.
Подразумевал немного другое. Это конечно проблема именно чисел с плавающей запятой. Но в языках с динамической типизацией увидеть использование таких чисел сложно. В C++ мы указываем тип числа, и знаем что можно ожидать от него.
xaker1, Лучше сразу писать так... а то те кто изучают сразу начинают ломать мозг... как динамическая типизация может влиять на арифметические расчеты...
Снова как дополнение: я переопределяю всегда этот toFixed, так как не нравится, что он возвращает String, а не Number Number.prototype.toFixed = function(x){ return Math.round(this * Math.pow(10, x)) / Math.pow(10, x);}
Хм, странный коммент. Конечно же round возвращает number, поэтому я его и использую, что бы toFixed возвращал number, ведь нативная функция возвращает стринг. А ваш код-сниппет совсем уж непонятный, берете number, применяете parseFloat, и возвращаете number ;)
Форматирование теряется, конечные нули обрезует, это вопервых, во вторых сравните эти две вещи:
3.255555 * Math.pow(10, 2) / Math.pow(10, 2)
и вот
(3.255555).toFixed(2)-0
Вообще-то вот неточные вычисления. Там есть почему и как бороться, хотя тут вообщем-то уже ответили. Но это как прув, так как сайт вполне авторитетный.
Кстати, я начал изучения javacript с этого учебника. Сразу в голове, конечно, не уложится, но во-время написания кода всплывет и спасет от таких детских ошибок.