В Chrome Javascript консоли набираю следующее:Javascript - Расчет ошибки
3.1 * 3.68
И результат возвращает:
11.408000000000001
Почему результат: не
11.408
В Chrome Javascript консоли набираю следующее:Javascript - Расчет ошибки
3.1 * 3.68
И результат возвращает:
11.408000000000001
Почему результат: не
11.408
Ошибки с плавающей точкой вполне нормальные, это связано с проблемами, присущими представлению чисел с плавающей запятой в двоичном формате.
Читайте также: What Every Computer Scientist Should Know About Floating-Point Arithmetic.
Причина «смешного» результата заключается в неточном представлении с плавающей запятой внутри определенных чисел. В то время как 3.1 * 3.68 приводит к 15 десятичным знакам, как 3.11 * 3.68, так и 3.1 * 3.67 дают ожидаемые 4 десятичных знака и 3 десятичных знака соответственно.
На практике эта ошибка «javascript» может привести к ошибке округления, когда ожидаемый результат имеет 3 десятичных знака, таких как .745, а результат с плавающей запятой имеет .744999999999999. Пример: 1.9 * 3.55 = 6.744999999999999 (должно быть 6.745). Для финансовых отчетов программа javascript даст 6.74 вместо ожидаемого округления 6.75. Большая головная боль для согласования бухгалтерского учета, даже если это случается менее 1 в 1000 случаях.
Один из способов, чтобы получить точные результаты, является для яваскрипта программиста после процесса результата, как в:
var r=1.9*3.55; r=r.toFixed(3); //=6.745, knowing that the results should be 3 decimals r=r.toFixed(2); // round to 2 decimals
К сожалению, нет JavaScript двигателя сегодня не может сделать этот маленький легкий шаг, чтобы прийти на ожидаемый результат. Чтобы гарантировать точную десятичную арифметику (по крайней мере, для финансового использования, в отличие от научного или астрономического использования), все, что требуется движку javascript, это определить n = (число десятичных знаков в результате), затем сделать toFixed (n) во внутреннем плавании точечный результат.
вы можете использовать метод toFixed браузеров, более подробно:
Метод Число
Реализовано в JavaScript 1.5
ECMAScript издание ECMAScript 3rd Edition
Синтаксис
Number.toFixed ([цифры])
Параметр
цифры количество цифр после запятой; это может быть значение от 0 до 20 включительно, а реализации могут необязательно поддерживать более широкий диапазон значений. Если этот аргумент опущен, то он рассматривается как 0.
Возвращения
строковое представление числа, которое не использует экспоненциальное обозначения и имеет ровно цифры цифры после десятичной точки.При необходимости число округляется, а дробная часть заполняется нулями, если необходимо, чтобы она имела указанную длину. Если число больше 1e + 21, этот метод просто вызывает Number.toString() и возвращает строку в экспоненциальной нотации.
Броски
RangeError Если цифры слишком малы или слишком велики. Значения от 0 до 20 включительно не будут вызывать RangeError. Реализации также могут поддерживать большие и меньшие значения. TypeError Если этот метод вызывается для объекта, который не является числом.
для вашей проблемы использования (3.1 * 3.68) .toFixed (3); //11.408
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Number/toFixed
http://stackoverflow.com/questions/273371/real-vs-floating-point-vs-money – 2010-12-03 13:05:04
что такое решение? – Toskan 2016-09-28 00:12:50
ах, решение таково: http://stackoverflow.com/a/14728473/533426 – Toskan 2016-09-28 00:18:09