将数字格式化为始终显示两位小数

1225

我想要将数字格式化为始终显示两位小数,必要时要四舍五入。

例如:

number     display
------     -------
1          1.00
1.341      1.34
1.345      1.35

我一直在使用这个:

parseFloat(num).toFixed(2);

但它显示的是1,而不是1.00


2
我指的是如果我输入1,它不会显示为1.00,但是如果我输入1.345,则会显示为1.35。 - Varada
1
我已经重新表述了你的问题,以符合你所寻找的内容。请检查以确保我正确理解了你的意思。 - drudge
精确舍入,支持IE。https://gist.github.com/ArminVieweg/28647e735aa6efaba401 - TarranJones
可能是将数字格式化为两位小数的重复问题。 - ma11hew28
显示剩余2条评论
38个回答

13

一个更加通用的解决方案,可以将数字舍入到N位小数

function roundN(num,n){
  return parseFloat(Math.round(num * Math.pow(10, n)) /Math.pow(10,n)).toFixed(n);
}


console.log(roundN(1,2))
console.log(roundN(1.34,2))
console.log(roundN(1.35,2))
console.log(roundN(1.344,2))
console.log(roundN(1.345,2))
console.log(roundN(1.344,3))
console.log(roundN(1.345,3))
console.log(roundN(1.3444,3))
console.log(roundN(1.3455,3))

Output

1.00
1.34
1.35
1.34
1.35
1.344
1.345
1.344
1.346

2
这个答案在接近0的某些数字上失败了,roundN(-3.4028230607370965e+38,2)返回"-3.4028230607370965e+38"而不是预期的0.00。 - Ferrybig
很有趣,@Ferrybig。我会测试你提到的数字并想出一个解决方法,感谢你的测试。 - PirateApp
2
请注意,上述数字不应显示为零,而应显示一个巨大的数字,这只是我的大脑错误。但它仍然无法正常工作,因为它仍然没有显示2位小数。 - Ferrybig

13

你在寻找地板吗?

var num = 1.42482;
var num2 = 1;
var fnum = Math.floor(num).toFixed(2);
var fnum2 = Math.floor(num2).toFixed(2);
console.log(fnum + " and " + fnum2); //both values will be 1.00


5
他不想舍去小数,取最近的整数。 - drudge
是的,从描述中我不确定,但我只是提出来以防万一。 - samwise

11

好消息!!! 看起来新版JavaScript,ES2020(我正在使用)提供了此函数的新行为。

let ff:number =3
console.info(ff.toFixed(2)) //3.00

按照要求。


10

如果你已经在使用jQuery,那么你可以考虑使用jQuery Number Format插件。

该插件可以将格式化的数字作为字符串返回,你可以设置小数点和千位分隔符,并且可以选择要显示的小数位数。

$.number( 123, 2 ); // Returns '123.00'

你也可以从GitHub获取jQuery数字格式化


11
仅仅为了固定小数位长度而使用插件是有些过度的。 - Lashae
11
@Lashae,好的,如果你只想这样做的话。我发布了这个帖子,以防万一原贴作者或其他人也想要插件提供的额外功能。 - Sam Sehnert
如果问题的发布者当然添加了jQuery标签 ;) - fullstacklife

8

这是您所想要的吗?

[编辑20200530] @razu提供的答案我认为是最好的。因此,这里有一个略微重构的版本。

片段代码仍无法返回诸如showAsFloat(2.3346)这样的值(结果为2.33,但应该是2.34)。因此,请参见也看看

const showAsFloat = (input, decimals = 2, asString = false) => {
  if (input === null || input.constructor === Boolean || isNaN(+input)) {
    return input;
  }
  const converted = +( `${Math.round( parseFloat( `${input}e${decimals}` )  )}e-${decimals}` );
  return asString ? converted.toFixed(decimals) : converted
};

document.querySelector('#result').textContent = [
  'command                      | result',
  '-----------------------------------------------',
  'showAsFloat(1);              | ' + showAsFloat(1),
  'showAsFloat(1.314);          | ' + showAsFloat(1.314),
  'showAsFloat(\'notanumber\')    | ' + showAsFloat('notanumber'),
  'showAsFloat(\'23.44567\', 3)   | ' + showAsFloat('23.44567', 3),
  'showAsFloat(2456198, 5, true)| ' + showAsFloat('24568', 5, true),
  'showAsFloat(2456198, 5)      | ' + showAsFloat('24568', 5),
  'showAsFloat(0, 2, true);     | ' + showAsFloat(0, 2, true),
  'showAsFloat(1.345);          | ' + showAsFloat(1.345),
  'showAsFloat(0.005);          | ' + showAsFloat(0.005),
  'showAsFloat(null);           | ' + showAsFloat(null),

].join('\n');
<pre id="result"></pre>


请注意,此解决方案在某些情况下无法正确四舍五入:1.005 四舍五入后为 1.00,而 1.345 则为 1.34 - zcoop98
这就是为什么@razu的答案应该被接受的原因... - KooiInc

6

将一个数字转换为字符串,仅保留两位小数:

var num = 5.56789;
var n = num.toFixed(2);

n的结果将会是:

5.57

6

我刚刚遇到了最长的一条线程之一,以下是我的解决方案:

parseFloat(Math.round((parseFloat(num * 100)).toFixed(2)) / 100 ).toFixed(2)

如果有人能够破解,请告诉我。


4
function currencyFormat (num) {
    return "$" + num.toFixed(2).replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,")
}

console.info(currencyFormat(2665));   // $2,665.00
console.info(currencyFormat(102665)); // $102,665.00

3

在需要特定格式时,您应编写自己的程序或使用库函数来完成所需操作。基本的ECMAScript功能通常不足以显示格式化数字。

关于四舍五入和格式化的详细解释,请参考:http://www.merlyn.demon.co.uk/js-round.htm#RiJ

通常情况下,只有在输出前的最后一步才进行四舍五入和格式化。如果提前进行此操作,可能会引入意外大的误差并破坏格式。


有时候我会对自己最近如此深入涉足整个JS/Ecma平台的选择感到摇头不已。:("当需要特定的格式时,你应该编写自己的程序或使用一个能满足你需求的库函数。基本的ECMAScript功能通常不足以显示格式化的数字。"多么愚蠢的陈述 - 不是因为你说了这句话,而是因为这个事实存在。真是悲哀。加油,Javascript!:) - ChrisH

3

这里有另一种仅使用 floor 函数进行四舍五入的解决方案,确保计算出的金额不会超过原始金额(有时需要用于交易):

Math.floor(num* 100 )/100;

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