我正在处理相对较小且简单的数字。我首先尝试用臭名昭着的toFixed进行舍入(数字后2个符号)。这是一个已知问题:有时它工作不正常。但令我印象深刻的是,它也是不一致的:
(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也有问题吗?那么,应该使用什么方法?
答案 0 :(得分:3)
不幸的是,众所周知,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)
答案 1 :(得分:1)
我认为这是按设计工作的。请记住,这些数字存储在基数2中,因此在转换为基数10时会有精度损失。如果要了解这些转换看起来不一致,则必须查看这些转换。如果您要精确保留固定的小数位数,则可以使用整数进行操作,仅转换为显示。