低舍入精度



我试图通过使用_.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后加到数字上?

这是因为数字在内部被表示为精度有限的二进制数。

参见"是浮点数学坏了吗?"


是浮点数学坏了吗?

0.1 + 0.2 == 0.3→假

0.1 + 0.2 ->0.30000000000000004

知道为什么会这样吗?

得到了答案:

二进制浮点数学是这样的。在大多数编程语言中,它是基于IEEE 754标准的。JavaScript使用64位浮点表示,这与Java的double相同。问题的关键在于,数字在这种格式中被表示为整数乘以2的幂;有理数(如0.1,即1/10)的分母不是2的幂,则不能精确表示。


要得到正确的结果,您需要在之后四舍五入所有算术:

var num = 0.056789,
  roundingPrecision = 4,
  roundedNum = _.round(num * 100, roundingPrecision),
  percent = roundedNum + '%';
console.log(percent); // 5.6789%
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.min.js"></script>

最新更新