JS浮点导致不正确的舍入

anu*_*shr 5 javascript math

我有可能是一个边缘案例场景.当试图将值舍入4.015到2位小数时,我总是最终得到4.01而不是预期的4.02.对于具有.015小数部分的所有数字,这种情况始终如一.

我在JS中使用了一个相当常见的方法:

val = Math.round(val * 100) / 100;
Run Code Online (Sandbox Code Playgroud)

我认为问题在乘以100时开始.浮点不准确导致该值向下舍入而不是向上.

var a = 4.015,                // 4.015
    mult = a * 100,           // 401.49999999999994 (the issue)
    round = Math.round(mult), // 401
    result = round / 100;     // 4.01 (expected 4.02)
Run Code Online (Sandbox Code Playgroud)

小提琴:http://jsfiddle.net/eVXRL/

如果我尝试回合,这个问题就不会发生4.025.期望值4.03确实回归; 它只是一个问题.015(到目前为止).

有没有办法优雅地解决这个问题?当然只有.015一次性寻找和处理这种情况的黑客,但这似乎是错误的!

anu*_*shr 4

我最终使用math.js进行数学运算,这解决了我所有的浮点问题。

该库的优点是不需要实例化任何类型的 Big Decimal 对象(即使该库确实支持 BigDecimal)。就像替换和传递精度一样Math简单math