2010-12-03 3 views
5

В Chrome Javascript консоли набираю следующее:Javascript - Расчет ошибки

3.1 * 3.68 

И результат возвращает:

11.408000000000001 

Почему результат: не

11.408 
+0

http://stackoverflow.com/questions/273371/real-vs-floating-point-vs-money – 2010-12-03 13:05:04

+0

что такое решение? – Toskan 2016-09-28 00:12:50

+0

ах, решение таково: http://stackoverflow.com/a/14728473/533426 – Toskan 2016-09-28 00:18:09

ответ

2

Причина «смешного» результата заключается в неточном представлении с плавающей запятой внутри определенных чисел. В то время как 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) во внутреннем плавании точечный результат.

3

вы можете использовать метод 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