我正在处理相对较小和简单的数字。我首先尝试用臭名昭著的toFixed进行舍入(数字后两位)。这是一个已知的问题:有时它无法正常工作。但是令我震惊的是,它也不一致地工作:
(0.395).toFixed(2); // "0.40"
(0.295).toFixed(2); // "0.29"
这些数字非常相似,数字后面有3个符号,但行为却有所不同。
因此,我决定改用Math.round。不久,我遇到了另一个问题:
Math.round(0.35055 * 10000) / 100; // produces 35.05 instead of 35.06
Math.round也有问题吗?那么,应该使用哪种方法?
最佳答案
不幸的是,众所周知JavaScript具有这样的精度问题,这些问题可以在以下问题中得到更好的解释:Is floating point math broken?,如注释中所指出的。
如果您需要更高程度的数值精度,建议您使用BigNumber之类的库,该库也附带了自己的toFixed
方法。
您的示例如下所示:
var a = new BigNumber('0.35055');
a = a.times(10000)
a = a.dividedBy(100)
console.log(a.toFixed(2)); //would log "35.06"
为简便起见,您还可以链接操作,如下所示:
a.times(10000).dividedBy(100).toFixed(2)
关于javascript - 在JS中四舍五入:不一致和意外的行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46770986/