对于舍入小数(价格),我已经使用.toFixed(2)已经有一段时间了。但我最近发现Javascript不能“精确”地舍入小数。我有点震惊,即使10.005无法正确舍入到10.01。它只是向下舍入到10.00。而其他时候它确实圆了。我喜欢控制我的代码,所以对我来说这是一个很大的禁忌。
由于我正在计算价格,我认为我需要更多(100%)准确的内容,只能舍入2或3个十进制数,可能是4个十进制数。
有没有简单的方法在javascript中进行基本舍入,这是正确的方法吗?
更新:正如费利克斯·克林所建议的,将我的价格作为美分整数处理的方法,这也有缺点(除了更多的代码)?
答案 0 :(得分:0)
像10.005这样的数字不能正确舍入的原因是你没有真正拥有数字10.005,你只有一个可以用双重表示的最接近的数字精度浮点变量。
你拥有的实际数字可能有点像10.00499999999276253,那自然会变成10.00而不是10.01。
要处理货币值,您应该使用可以准确表示值的数据类型。由于Javascript中的数字总是浮点数,所以剩下的就是将数字表示为文本,并编写自己的函数来进行数学运算(或找到已经完成数据的人)。
答案 1 :(得分:0)
这应该对你有用,这是一个玩弄它的小提琴http://jsfiddle.net/5ffyC/1/
function moneyRound(flt){
var splitStr = flt.toString().split('.'),
whole = (flt * 100) | 0;
if (splitStr.length > 1 && splitStr[1].length > 2){
return splitStr[1][2] > 4? (whole + 1) / 100: whole / 100;
} else {
return flt;
}
}