2012-04-03 2 views
7

Я пришел по странной проблеме, я хочу сделать некоторые основные математические проверки. Я читал, чтобы избежать плавающих чисел, поэтому я решил умножить мои математические значения с , потому что мое значение может быть между 0.9 и 0.0025.JavaScript умножается неточно

Все работает правильно за исключением двух значений: 0,56 и 0,57:

var result = 0.57 * 10000 

исход: +5699,999999999999, я надеялся на 5700 !! И 0.56 также идет не так, но все остальные значения верны, чего мне здесь не хватает?

+4

[Что каждый ученый должен знать о плавающей запятой, арифметика] (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) –

+0

@JamesAllardice Знаменитый Голдберг Вариации! – kojiro

ответ

3

Ваши варианты в Javascript (действительно, на большинстве языков) являются целыми числами или числами с плавающей запятой. Если вы пишете «0.57», вы вынуждаете его в мир с плавающей точкой, где точность ограничена.

Если вы хотите абсолютную точность, вам нужно работать исключительно в целых числах.

3
var result = 0.57 * 10000; 
alert (Math.round(result));​ 
11

Наилучшим решением было бы использовать toFixed (х), и установите х число десятичных знаков, которые всегда должны быть больше, чем ожидаемые результаты после десятичной точки (я обычно ставлю 8 там).

Но вместо того, чтобы взломать -s kirilloid-, вы должны снова преобразовать результат обратно в номер, чтобы удалить ненужные десятичные знаки. После этого выполните любое форматирование, которое вам нравится на номере.

Так будет возвращен нужный результат:

var result = +(0.57 * 10000).toFixed(8) 

результат был бы в настоящее время

The + спереди, преобразует строку результата "toFixed" в число раз.

Надеюсь, что помогло!

0
var multiply = function(a, b) { 
    var commonMultiplier = 1000000; 

    a *= commonMultiplier; 
    b *= commonMultiplier; 

    return (a * b)/(commonMultiplier * commonMultiplier); 
}; 

Это работает в известном диапазоне. Поэтому было бы неплохо округлить число до десятичной точки, меньшую, чем commonMultiplier.

> multiply(3, .1) 
< 0.3 
> multiply(5, .03) 
< 0.15 
Смежные вопросы