5

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

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

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

fiddle

Почему +0,000000000000001 добавляется к числу после умножения на 100?

+0

http://stackoverflow.com/questions/1458633/how-to-deal-with-floating-point-number-precision-in-javascript –

+0

Спасибо @JamesDonnelly! –

+0

Просьба представить краткий ответ на ваш собственный вопрос @TimPerkins. Ссылка, на которую ссылается, может охватывать тему, но неясно, как именно. –

ответ

5

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

Смотрите также


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

0,1 + 0,2 == 0,3 -> ложь

0,1 + 0,2 -> 0,30000000000000004

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

Который получил ответ:

Binary floating point математика, как это. В большинстве языков программирования он основан на IEEE 754 standard. 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>

Смежные вопросы