Точность округления 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>