Javascript .toFixed()更精确的舍入替代?

时间:2012-10-07 10:55:55

标签: javascript jquery

对于舍入小数(价格),我已经使用.toFixed(2)已经有一段时间了。但我最近发现Javascript不能“精确”地舍入小数。我有点震惊,即使10.005无法正确舍入到10.01。它只是向下舍入到10.00。而其他时候它确实圆了。我喜欢控制我的代码,所以对我来说这是一个很大的禁忌。

由于我正在计算价格,我认为我需要更多(100%)准确的内容,只能舍入2或3个十进制数,可能是4个十进制数。

有没有简单的方法在javascript中进行基本舍入,这是正确的方法吗?

更新:正如费利克斯·克林所建议的,将我的价格作为美分整数处理的方法,这也有缺点(除了更多的代码)?

2 个答案:

答案 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;   
   }
}