2

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

而且由于我正在计算价格,我认为我需要一些更准确的(100%)来仅舍入 2 位或 3 位小数,也许是 4 位小数。

没有正确的方法在javascript中进行基本舍入的直接方法吗?

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

4

2 回答 2

1

像 10.005 这样的数字不能正确四舍五入的原因是您实际上没有数字 10.005,您只有一个可以使用双精度浮点变量表示的最接近的数字。

您拥有的实际数字可能类似于 10.00499999999276253,自然会四舍五入为 10.00 而不是 10.01。

要处理货币值,您应该使用可以准确表示该值的数据类型。由于 Javascript 中的数字始终是浮点数,剩下的就是将数字表示为文本,并编写自己的函数来进行数学运算(或找到已经做过的人)。

于 2012-10-07T11:11:21.627 回答
0

This should work for you, here's a fiddle to play around with it 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;   
   }
}
于 2012-10-07T13:34:58.117 回答