我试图通过使用_.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>