JavaScript умножить не точно - PullRequest
       9

JavaScript умножить не точно

7 голосов
/ 03 апреля 2012

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

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

var result = 0.57 * 10000

Результат: 5699.999999999999 , я надеялся на 5700 !! И 0.56 тоже идет не так, но все остальные значения верны, что мне здесь не хватает?

Ответы [ 5 ]

13 голосов
/ 04 июня 2012

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

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

Таким образом, это вернет нужный результат:

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

результат будет теперь 5700

Перед + преобразует строковый результат «toFixed» в число снова.

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

3 голосов
/ 03 апреля 2012

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

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

3 голосов
/ 03 апреля 2012
var result = 0.57 * 10000;
alert (Math.round(result));​
2 голосов
/ 16 января 2013
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
0 голосов
/ 03 апреля 2012

Hacky решение: value.toFixed(4).substr(-4).replace(/^0+/, "");

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...