保留两位小数

121

我不知道如何做到这一点?我正在添加逗号数字,结果当然总是一个有太多逗号后面数字的数字。有人可以帮忙吗?


1
对于某些语言环境,逗号会被替换成句点。 - DOK
@Matt - 这是 jParseFloat 插件的一部分,它将成为 jQuery 核心的一部分在 1.5 版本中! - Nick Craver
10个回答

185

编辑2:

使用Number对象的toFixed方法,如下所示:

var num = Number(0.005) // The Number() only visualizes the type and is not needed
var roundedString = num.toFixed(2);
var rounded = Number(roundedString); // toFixed() returns a string (often suitable for printing already)

将42.0054321四舍五入为42.01

将0.005四舍五入为0.01

将-0.005四舍五入为-0.01(所以绝对值在.5边界处进位)

jsFiddle示例


1
@Sten - 逗号还是小数点?你的问题和示例不一致。 - Nick Craver
14
如果你想将数字0.007四舍五入到小数点后两位,那么这个例子就不起作用了。使用这个方法得到的结果是:Math.round(0.007) -> 0.000,然后toFixed(2) -> 0.00。实际上,正确的四舍五入应该得到0.01。请注意,原文意思未改变。 - Andrei
13
下降票:答案是不正确的,因为Math.round()会四舍五入数字,从而去掉所有小数位。而所有的toFixed(2)只是添加了两个尾随的零。只需要使用number.toFixed(2)就可以了。 - HammerNL
2
应该采取措施,因为这个答案是错误的,其他人可能会盲目使用被接受的答案而不阅读评论。 - Pedro Moreira
1
-1:在您的示例中,3.1415 变成了 3.00 - user1180790
显示剩余2条评论

125

更新:请记住,当本答案最初于2010年编写时,下列的 toFixed() 函数工作方式略有不同。现在,toFixed() 似乎会进行一些四舍五入,但不是以严格的数学方式进行。因此要小心使用,自己进行测试... 下面描述的方法将按照数学家的预期进行四舍五入。

  • toFixed() 方法将数字转换为字符串,并保留指定数量的小数位。它实际上并不会对数字进行四舍五入,而是截断数字。
  • Math.round(n) 会将一个数四舍五入到最近的整数。因此将:

0.5 -> 1; 0.05 -> 0

所以如果你想将数字 0.55555 四舍五入到小数点后第二位,可以按照以下步骤操作(这是逐步的概念):

  • 0.55555 * 100 = 55.555
  • Math.Round(55.555) -> 56.000
  • 56.000 / 100 = 0.56000
  • (0.56000).toFixed(2) -> 0.56

代码如下:

(Math.round(number * 100)/100).toFixed(2);

我使用相同的方法。效果很好。 - Indiana Kernick
例如当您已经有一个带有所需小数位数的小数时,会导致问题,如下面的代码:
(Math.round(123.12124 * 100)/100).toFixed(4); ===> 123.1200
- Maksim Nesterenko
2
你忘记修改取舍的算法了,像这样:Math.round(123.12124 * 10000)/10000).toFixed(4)。如果你想四舍五入到小数点后第四位,就是这样子写。 - Andrei
错误:toFixed()会四舍五入数字,因此它不是截断。请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed - MikeB
.toFixed() 实际上是将数字四舍五入。我刚测试了一下:0.6666.toFixed(3) => 0.667 - Victor Gorban
显示剩余3条评论

66

这对我起作用:

var new_number = float.toFixed(2);

示例:

var my_float = 0.6666

my_float.toFixed(3) # => 0.667

我认为这个问题在于它没有“四舍五入”数字,所以0.6666.toFixed(3)变成了0.666而不是0.667。@Andrei似乎有正确的解决方案来正确地进行四舍五入。 - Joshua Pinter
1
哈!没关系。我刚刚测试了一下,toFixed() 完美地工作了:0.6666.toFixed(3) # => 0.667。我会把它加入到你的答案中。 - Joshua Pinter
3
最短且最佳。这应该是被接受的答案。 - user1180790
当你尝试将32.675四舍五入时,你会得到32.68,而不是32.67。哈哈 - undefined

15

之前的回答忘记将输出再次输入为数字。有几种方法可以做到这一点,具体取决于您的喜好。

Previous answers忘了将输出转换为数字。有几种方法可以做到这一点,具体取决于您的个人喜好。

+my_float.toFixed(2)

Number(my_float.toFixed(2))

parseFloat(my_float.toFixed(2))

1
在我看来,这是最好的答案。它简单明了,结果是一个数字。 - Kar.ma

6
这并不是CPU友好的,但是:
Math.round(number*100)/100

正常运行。

4

虽然我们在这里有许多答案并提供了很多有用的建议,但每一个答案仍然缺失一些步骤。
因此,这里有一个完整的解决方案封装成小函数:

function roundToTwoDigitsAfterComma(floatNumber) {
    return parseFloat((Math.round(floatNumber * 100) / 100).toFixed(2));
}

如果您有兴趣了解这是如何工作的:

  1. 乘以100,然后四舍五入保留2位小数
  2. 除以100并使用toFixed(2)保留2位小数并丢弃其他无用部分
  3. 通过使用parseFloat()函数将其转换回浮点数,因为toFixed(2)返回字符串

注意:如果由于涉及货币价值而保留最后2位小数,并且进行财务计算,请记住这不是一个好主意,最好使用整数值代替。


1
请使用以下代码。
alert(+(Math.round(number + "e+2")  + "e-2"));

2
这个答案本质上与其他回答这个7年老问题的答案做了同样的事情,但是它以一种非常晦涩的方式利用了JavaScript的隐式类型转换。这段代码的哪些特点让你决定在这里发布它? - u354356007
这个答案的优点在于它让我学到了一些我不知道的JS知识;-) - Deblaton Jean-Philippe

1
console.log((Math.random().toFixed(2)));

我已经习惯使用 tofixed(),仍然工作正常。


目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

1
以上所有建议似乎都不能适用于所有数字(包括负数)
1. 0.075 => 0.08 2. -0.075 => -0.08 3. 0.005 => 0.01 4. -0.005 => -0.01

Math.sign(num) * (Math.round((Math.abs(num) + Number.EPSILON) * 1e2) / 1e2);


1
我使用这个:

function round(value, precision) {

 if(precision == 0)
  return Math.round(value);   

 exp = 1;
 for(i=0;i<precision;i++)
  exp *= 10;

 return Math.round(value*exp)/exp;
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接