Точность округления Lodash

Я пытаюсь отобразить число в процентах с помощью _.round а затем умножением числа на 100. По какой-то причине, когда я умножаю округленное число, точность путается. Вот как это выглядит:

var num = 0.056789,
    roundingPrecision = 4,
    roundedNum = _.round(num, roundingPrecision),
    percent = (roundedNum * 100) + '%';

console.log(roundedNum); // 0.0568
console.log(percent); // 5.680000000000001%

скрипка

почему 0.000000000000001 добавляется к числу после умножения на 100?

1 ответов


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

см. также " математика с плавающей запятой сломана?"


математика с плавающей запятой сломана?

0.1 + 0.2 == 0.3 -> ложь

0.1 + 0.2 -> 0.30000000000000004

любые идеи, почему это происходит?

что получил ответ:

Бинарные с плавающей точкой математика-это такой. В большинстве языков программирования он основан на стандарт IEEE 754. JavaScript использует 64-битное представление с плавающей запятой, которое совпадает с Java double. Суть проблемы заключается в том, что числа представлены в этом формате как целое число, умноженное на два; рациональные числа (такие как 0.1, которая составляет 1/10), знаменатель которого не является степенью двух, не может быть точно представленный.


чтобы получить правильный результат в вашем случае, вам нужно округлить после вся арифметика:

var num = 0.056789,
  roundingPrecision = 4,
  roundedNum = _.round(num * 100, roundingPrecision),
  percent = roundedNum + '%';

console.log(percent); // 5.0569%
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.min.js"></script>