Lodash舍入精度

Tim*_*ins 7 javascript rounding percentage floating-point-precision 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%
Run Code Online (Sandbox Code Playgroud)

小提琴

为什么在乘以100后将0.000000000000001添加到数字?

Ben*_*ema 9

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

另请参阅"浮点数学是否已损坏?"


浮点数学是否破碎?

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.0569%
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.min.js"></script>
Run Code Online (Sandbox Code Playgroud)