将数字格式设置为始终显示 2 位小数

Format number to always show 2 decimal places

提问人:Varada 提问时间:5/26/2011 最后编辑:drudgeVarada 更新时间:1/24/2023 访问量:1904116

问:

我想将我的数字格式设置为始终显示小数点后 2 位,并在适用的情况下四舍五入。

例子:

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

我一直在用这个:

parseFloat(num).toFixed(2);

但它显示为 ,而不是 。111.00

JavaScript 浮点 数格式

评论

2赞 Varada 5/26/2011
我的意思是,如果我输入 1,它不会将数字显示为 1.00,但如果我输入 1.345,那么它将显示 1.35
1赞 drudge 5/27/2011
我已经把你的问题改写了我相信你在寻找的东西。请检查以确保我正确理解了您。
0赞 TarranJones 9/18/2015
IE支持精确舍入。gist.github.com/ArminVieweg/28647e735aa6efaba401
0赞 zero8 12/16/2016
可能的重复 在jQuery中,将数字格式化为小数点后2位的最佳方法是什么?
0赞 VLAZ 2/20/2019
JavaScript 中用正好两位小数格式化数字的可能重复

答:

13赞 samwise 5/26/2011 #1

您在寻找地板吗?

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 5/26/2011
我不认为他想四舍五入到最接近的整数。
0赞 samwise 5/26/2011
是的,我从描述中不确定,但我只是把它扔在那里以防万一
1713赞 drudge 5/26/2011 #2
(Math.round(num * 100) / 100).toFixed(2);

现场演示

var num1 = "1";
document.getElementById('num1').innerHTML = (Math.round(num1 * 100) / 100).toFixed(2);

var num2 = "1.341";
document.getElementById('num2').innerHTML = (Math.round(num2 * 100) / 100).toFixed(2);

var num3 = "1.345";
document.getElementById('num3').innerHTML = (Math.round(num3 * 100) / 100).toFixed(2);
span {
    border: 1px solid #000;
    margin: 5px;
    padding: 5px;
}
<span id="num1"></span>
<span id="num2"></span>
<span id="num3"></span>

请注意,它将四舍五入到小数点后 2 位,因此输入将返回 .1.3461.35

评论

15赞 drudge 5/27/2011
@Kooilnc:OP 希望显示为 ,并显示为 。11.001.3411.34
89赞 Milan Babuškov 12/15/2013
无需使用 round(),因为 toFixed() 对其进行了舍入。
63赞 TWright 10/15/2015
toFixed() 确实会四舍五入它,但不要忘记它返回一个字符串......所以这个方法实际上只对显示有用。如果要对舍入值执行进一步的数学计算,请不要使用 toFixed()。
10赞 Nate 1/15/2016
根据 MDN 的说法,由于舍入错误,Math.round 并不总是给出准确的结果。我用 1.005 测试了这一点,它应该四舍五入为 1.01,但它给出了 1.00。使用我的答案来保持一致的准确性:stackoverflow.com/a/34796988/3549440
28赞 RobG 8/15/2017
整个答案可以简化为 。它甚至保留了原版中的四舍五入错误,参见 Nate 的回答(+num).toFixed(2)
14赞 mplungjan 5/26/2011 #3

你没有给我们全貌。

javascript:alert(parseFloat(1).toFixed(2))当我将其粘贴到位置栏时,在我的浏览器中显示 1.00。 但是,如果您之后对它执行某些操作,它将恢复。

alert(parseFloat(1).toFixed(2))

var num = 2
document.getElementById('spanId').innerHTML = (parseFloat(num).toFixed(2) - 1)
<span id="spanId"></span>

shows 1 and not 1.00

评论

0赞 Florian Straub 1/7/2017
适用于 FF 50、Chrome 49 和 IE 8
3赞 RobG 5/26/2011 #4

如果需要特定格式,则应编写自己的例程或使用执行所需操作的库函数。基本的 ECMAScript 功能通常不足以显示格式化的数字。

有关舍入和格式的详尽说明如下:http://www.merlyn.demon.co.uk/js-round.htm#RiJ

作为一般规则,舍入和格式化应仅作为输出前的最后一步执行。提前执行此操作可能会引入意外的大错误并破坏格式。

评论

0赞 ChrisH 12/21/2017
有时我会对自己的选择摇头,最近如此深入地参与整个 JS/Ecma 平台。:(“在需要特定格式的情况下,您应该编写自己的例程或使用库函数来执行您需要的功能。基本的 ECMAScript 功能通常不足以显示格式化的数字。多么愚蠢的声明——不是你说的,而是因为这个事实存在。只是很难过。上球吧,Javascript!:)
8赞 KooiInc 5/26/2011 #5

你是这个意思吗?

[编辑20200530]@razu提供的答案是最好的恕我直言。所以这里有一个稍微重构的版本。

代码段代码仍然不会返回类似(结果 2.33,但应该是 2.34)的正确值。所以,另请参阅showAsFloat(2.3346)

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>

评论

0赞 zcoop98 5/29/2021
请注意,在某些情况下,此解决方案将无法正确舍入:结果为 ,和 。1.0051.001.3451.34
0赞 KooiInc 5/29/2021
这就是为什么@razu的答案应该是公认的......
36赞 Tiberiu Petcu 9/7/2012 #6

var num = new Number(14.12);
console.log(num.toPrecision(2)); //outputs 14
console.log(num.toPrecision(3)); //outputs 14.1
console.log(num.toPrecision(4)); //outputs 14.12
console.log(num.toPrecision(5)); //outputs 14.120

评论

0赞 shinzou 10/15/2016
这会产生意想不到的结果,如果你的数字可以是 1.4、23.654 和 0,你会采用什么精度?
5赞 Boaz 11/9/2016
请注意,OP 要求“在适用的情况下四舍五入”。 仅将数字格式化为特定数量的小数位,仅省略多余的位置,但不四舍五入。当然,这也非常有用,但了解其中的区别很重要。toPrecision
1赞 James L. 11/28/2017
实际上,根据Mozilla的说法,toPrecision确实是圆形的。测试:(20.55).toPrecision(3) "20.6"
5赞 James L. 11/28/2017
如果要去除尾随零,请在使用后将其转换为 Number 或 Float : 请勿使用 ,因为它在使用精度参数时会计算非十进制数。toFixedconst formattedVal = Number(val.toFixed(2));toPrecision
478赞 Abel ANEIROS 11/9/2012 #7
Number(1).toFixed(2);         // 1.00
Number(1.341).toFixed(2);     // 1.34
Number(1.345).toFixed(2);     // 1.34 NOTE: See andy's comment below.
Number(1.3450001).toFixed(2); // 1.35

document.getElementById('line1').innerHTML = Number(1).toFixed(2);
document.getElementById('line2').innerHTML = Number(1.341).toFixed(2);
document.getElementById('line3').innerHTML = Number(1.345).toFixed(2);
document.getElementById('line4').innerHTML = Number(1.3450001).toFixed(2);
<span id="line1"></span>
<br/>
<span id="line2"></span>
<br/>
<span id="line3"></span>
<br/>
<span id="line4"></span>

评论

1赞 Drew Noakes 8/23/2013
@Andre,Chrome 29.0.1547.57 给了我表达。1.34Number(1.345).toFixed(2)
1赞 andy 11/9/2013
toFixed 确实会进行舍入,您几乎可以在每个测试编号上看到舍入。
65赞 andy 11/9/2013
在完成之前不小心提交了最后一条评论.. 是一个不能完全存储在浮点数中的数字的例子,所以我认为它没有像你预期的那样四舍五入的原因是它实际上存储为一个略小于 1.345 的数字,并且它向下舍入。如果改为测试,则会看到它正确地四舍五入到1.345(1.34500001).toFixed(2)1.35
2赞 Bardicer 2/10/2021
很晚,但为了阐明“5”四舍五入,它总是四舍五入到最接近的偶数。1.345将四舍五入为1.34,但1.335也是如此。5 的一半时间上升,5 的一半时间下降。
1赞 Waweru Kamau 6/19/2021
@Bardicer,使用 toFixed(2) 将 1.335 四舍五入为 1.33
10赞 Sam Sehnert 11/9/2012 #8

如果你已经在使用jQuery,你可以考虑使用jQuery数字格式插件。

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

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

您还可以从 GitHub 获取 jQuery 数字格式

评论

11赞 Lashae 9/4/2013
使用插件“只是为了有固定长度的小数部分”是矫枉过正的。
11赞 Sam Sehnert 9/9/2013
@Lashae,当然,如果这就是你想做的。我发布此内容是为了以防 OP 或其他任何人也想要该插件提供的额外功能。
0赞 fullstacklife 3/30/2015
如果问题的发帖人添加了jQuery标签,当然;)
14赞 macio.Jun 4/9/2013 #9

最简单的答案:

var num = 1.2353453;
num.toFixed(2); // 1.24

示例:http://jsfiddle.net/E2XU7/

评论

13赞 Felix Kling 4/9/2013
好吧,早在 stackoverflow.com/a/13292833/218196 就已经建议了。您的问题还能提供哪些其他信息?toFixed
0赞 macio.Jun 4/10/2013
该答案不包括圆形功能,我的答案包括 tho。
10赞 Felix Kling 4/10/2013
害羞答案完全相同。拨打一个号码。toFixed
1赞 macio.Jun 4/10/2013
正确,相同的功能,但该答案的结果具有误导性,我只是通过表达圆形功能来纠正它。
1赞 Stijn de Witt 8/2/2017
他的回答表明确实可以四舍五入。toFixed
1赞 Darshak Shekhda 9/18/2014 #10
var quantity = 12;

var import1 = 12.55;

var total = quantity * import1;

var answer = parseFloat(total).toFixed(2);

document.write(answer);
-3赞 Crow Soup 7/8/2015 #11
(num + "").replace(/^([0-9]*)(\.[0-9]{1,2})?.*$/,"$1$2")
4赞 ArNo 8/19/2015 #12
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
157赞 razu 8/24/2015 #13

如果出现以下情况,此答案将失败。value = 1.005

作为更好的解决方案,可以通过使用以指数表示法表示的数字来避免舍入问题:

Number(Math.round(1.005+'e2')+'e-2'); // 1.01

@Kon 和原作者建议的更简洁的代码:

Number(Math.round(parseFloat(value + 'e' + decimalPlaces)) + 'e-' + decimalPlaces)

您可以在末尾添加以保留小数点,例如: 但请注意,它将以字符串形式返回。toFixed()1.00

Number(Math.round(parseFloat(value + 'e' + decimalPlaces)) + 'e-' + decimalPlaces).toFixed(decimalPlaces)

信用:JavaScript 中的四舍五入小数

评论

21赞 Armfoot 9/25/2015
令人惊讶的是,这里的其他人都没有看到有四舍五入的问题。你的答案应该是被接受的答案。toFixed
1赞 Artistan 7/19/2017
刚刚测试了一下,看看是否仍然如此。对于Chrome版本59.0.3071.115,您仍然是正确的 您的解决方案将向上舍入为 1.005 (1.01),向下舍入为 1.00499999 (1.00)
0赞 Artistan 7/20/2017
jsfiddle.net/Artistan/qq895bnp/28 有些时候 toFixed 会起作用,但它非常不一致。:)
0赞 user889030 9/26/2017
parseFloat 中的 surround Number 是其返回的字符串
7赞 Kon 4/26/2019
这是一个可靠的答案。我能想到的几个改进:(1) VS Code(TypeScript 文件)不喜欢 Math.round() 传入字符串。(2)使小数位数动态化(不硬编码为2)。(3) toFixed() 似乎没有必要。所以我想出的是Number(Math.round(parseFloat(value + 'e' + decimalPlaces)) + 'e-' + decimalPlaces)
3赞 Minas Mina 9/18/2015 #14

下面还有一个通用函数,可以格式化为任意数量的小数位:

function numberFormat(val, decimalPlaces) {

    var multiplier = Math.pow(10, decimalPlaces);
    return (Math.round(val * multiplier) / multiplier).toFixed(decimalPlaces);
}
22赞 zloctb 11/28/2015 #15

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat

var number = 123456.789;
console.log(new Intl.NumberFormat('en-IN', {
  maximumFractionDigits: 2
}).format(number));

评论

0赞 Jay 1/24/2023
如果您希望它始终显示 2 位小数,即使是整数,那么使用的选项不是最大值。developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/......minimumFractionDigits
31赞 Nate 1/15/2016 #16

为了获得最准确的舍入,请创建此函数并使用它来四舍五入到小数点后 2 位:

function round(value, decimals) {
  return Number(Math.round(value + 'e' + decimals) + 'e-' + decimals).toFixed(decimals);
}



console.log("seeked to " + round(1.005, 2));

> 1.01

感谢 Razu本文MDN 的 Math.round 参考

评论

2赞 4esn0k 10/2/2016
1.00499999999999998934 呢?
1赞 Stephen Adelakun 10/4/2016
它不会超过 2 d.p
4赞 Artistan 7/20/2017
jsfiddle.net/Artistan/qq895bnp 测试,这是我见过的唯一一致的方法。谢谢。
6赞 Behnam 6/21/2016 #17

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

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

n 的结果将是:

5.57
0赞 YHDEV 10/16/2016 #18

我确实喜欢:

var num = 12.749;
parseFloat((Math.round(num * 100) / 100).toFixed(2)); // 123.75

将数字四舍五入到小数点后 2 位, 然后确保解析它以返回 Number,而不是 String,除非您不在乎它是 String 还是 Number。parseFloat()

评论

0赞 Stijn de Witt 8/2/2017
我想如果目的是以 2 位小数精度显示,解析浮点数会搞砸这一点。例如parseFloat("1.00") // 1
0赞 bortunac 2/1/2017 #19

使用 precision 方法扩展 Math 对象

Object.defineProperty(Math, 'precision',{
   value: function (value,precision,type){
             var v = parseFloat(value),
                 p = Math.max(precision,0)||0,
                 t = type||'round';
              return (Math[t](v*Math.pow(10,p))/Math.pow(10,p)).toFixed(p);
          }
    });

console.log(
    Math.precision(3.1,3), // round 3 digits 
    Math.precision(0.12345,2,'ceil'), // ceil 2 digits
    Math.precision(1.1) // integer part
)

-3赞 Alexei 7/15/2017 #20

这是我解决问题的方式:

parseFloat(parseFloat(floatString).toFixed(2));
13赞 PirateApp 9/6/2017 #21

用于四舍五入到 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赞 Ferrybig 4/17/2019
此 alswer 失败,某些数字接近 0,返回而不是预期的 0.00roundN(-3.4028230607370965e+38,2)"-3.4028230607370965e+38"
0赞 PirateApp 4/17/2019
有趣的是@Ferrybig我将测试您提到的数字并想出解决方法,感谢您的测试
2赞 Ferrybig 4/17/2019
请注意,前面提到的数字不应该显示零,而是一个巨大的数字,这只是我大脑中的一个错误。但它仍然不起作用,因为它仍然不显示 2 位小数
2赞 Leonardo Filipe 10/21/2017 #22

function number_format(string,decimals=2,decimal=',',thousands='.',pre='R$ ',pos=' Reais'){
  var numbers = string.toString().match(/\d+/g).join([]);
  numbers = numbers.padStart(decimals+1, "0");
  var splitNumbers = numbers.split("").reverse();
  var mask = '';
  splitNumbers.forEach(function(d,i){
    if (i == decimals) { mask = decimal + mask; }
    if (i>(decimals+1) && ((i-2)%(decimals+1))==0) { mask = thousands + mask; }
    mask = d + mask;
  });
  return pre + mask + pos;
}
var element = document.getElementById("format");
var money= number_format("10987654321",2,',','.');
element.innerHTML = money;
#format{
display:inline-block;
padding:10px;
border:1px solid #ddd;
background:#f5f5f5;
}
<div id='format'>Test 123456789</div>

-3赞 Be Wake Pandey 9/17/2018 #23

parseInt(number * 100) / 100;为我工作。

1赞 vitek 10/13/2018 #24

我必须在 parseFloat() 和 Number() 转换之间做出决定,然后才能进行 toFixed() 调用。下面是在捕获用户输入后设置数字格式的示例。

HTML格式:

<input type="number" class="dec-number" min="0" step="0.01" />

事件处理程序:

$('.dec-number').on('change', function () {
     const value = $(this).val();
     $(this).val(value.toFixed(2));
});

上述代码将导致 TypeError 异常。请注意,虽然 html 输入类型是“number”,但用户输入实际上是“string”数据类型。但是,toFixed() 函数只能在作为 Number 的对象上调用。

我的最终代码如下所示:

$('.dec-number').on('change', function () {
     const value = Number($(this).val());
     $(this).val(value.toFixed(2));
});

我赞成使用 Number() 与 parseFloat() 进行强制转换的原因是,我不必对空输入字符串和 NaN 值执行额外的验证。Number() 函数将自动处理一个空字符串并将其转换为零。

114赞 holmis83 11/19/2018 #25

对于现代浏览器,请使用 toLocaleString

var num = 1.345;
num.toLocaleString(undefined, { maximumFractionDigits: 2, minimumFractionDigits: 2 });

将区域设置标记指定为第一个参数以控制小数点分隔符。对于点,请使用例如美国英语区域设置:

num.toLocaleString("en-US", { maximumFractionDigits: 2, minimumFractionDigits: 2 });

这给了:

1.35

欧洲的大多数国家/地区都使用逗号作为小数点分隔符,因此,例如,如果您使用瑞典/瑞典语言环境:

num.toLocaleString("sv-SE", { maximumFractionDigits: 2, minimumFractionDigits: 2 });

它将提供:

1,35

3赞 Naty 12/9/2018 #26

这是仅使用下限进行舍入的另一种解决方案,这意味着,确保计算出的金额不会大于原始金额(有时交易需要):

Math.floor(num* 100 )/100;
2赞 Tsuna Sawada 4/30/2019 #27

请尝试以下代码:

function numberWithCommas(number) { 

   var newval = parseFloat(Math.round(number * 100) / 100).toFixed(2);

   return newval.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
6赞 Sam Johnson 5/29/2019 #28

刚遇到这个最长的线程之一,下面是我的解决方案:

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

如果有人可以戳洞,请告诉我

-2赞 VnDevil 9/25/2019 #29

您可以尝试以下代码:

    function FormatNumber(number, numberOfDigits = 2) {
        try {
            return new Intl.NumberFormat('en-US').format(parseFloat(number).toFixed(numberOfDigits));
        } catch (error) {
            return 0;
        }
    }

    var test1 = FormatNumber('1000000.4444');
    alert(test1); // 1,000,000.44

    var test2 = FormatNumber(100000000000.55555555, 4);
    alert(test2); // 100,000,000,000.5556

评论

1赞 Jurgen Dictus 10/13/2020
最好将 toFixed(2) 更改为 toFixed(numberOfDigits) :D
1赞 Ehtesham Ahmad Nadim 2/5/2020 #30

var num1 = "0.1";
document.getElementById('num1').innerHTML = (Math.round(num1 * 100) / 100).toFixed(2);

var num2 = "1.341";
document.getElementById('num2').innerHTML = (Math.round(num2 * 100) / 100).toFixed(2);

var num3 = "1.345";
document.getElementById('num3').innerHTML = (Math.round(num3 * 100) / 100).toFixed(2);
span {
    border: 1px solid #000;
    margin: 5px;
    padding: 5px;
}
<span id="num1"></span>
<span id="num2"></span>
<span id="num3"></span>

评论

5赞 kva 2/26/2020
这段代码足以满足您的要求parseFloat(num.toFixed(2))
1赞 Kamil Kiełczewski 10/16/2020 #31

RegExp - 替代方法

在输入时,你有字符串(因为你使用解析),所以我们可以只使用字符串操作和整数计算来获得结果

let toFix2 = (n) => n.replace(/(-?)(\d+)\.(\d\d)(\d+)/, (_,s,i,d,r)=> {
  let k= (+r[0]>=5)+ +d - (r==5 && s=='-');
  return s + (+i+(k>99)) + "." + ((k>99)?"00":(k>9?k:"0"+k));
})


// TESTs

console.log(toFix2("1"));
console.log(toFix2("1.341"));
console.log(toFix2("1.345"));
console.log(toFix2("1.005"));

解释

  • s是符号,是整数部分,是点之后的前两位数字,是其他数字(我们使用值来计算四舍五入)idrr[0]
  • k包含有关最后两位数字(表示为整数)的信息
  • 如果是,那么我们加到 - 但是如果我们有负数 () 并且正好等于 5,那么在这种情况下,我们减去 1(出于兼容性原因 - 以同样的方式适用于负数,例如r[0]>=51ds=='-'rMath.roundMath.round(-1.5)==-1)
  • 之后,如果最后两位数字大于 99,那么我们将一个添加到整数部分ki
-2赞 moez cherif 6/18/2021 #32
function formatValeurDecimal(valeurAFormate,longueurPartieEntier,longueurPartieDecimal){

valeurAFormate = valeurAFormate.replace(",",".")
valeurAFormate = parseFloat(valeurAFormate).toFixed(longueurPartieDecimal)
if(valeurAFormate == 'NaN'){
    return 0
}

//____________________valeurPartieEntier__________________________________
var valeurPartieEntier = valeurAFormate | 0

var strValeur = valeurPartieEntier.toString()
strValeur = strValeur.substring(0, longueurPartieEntier)
valeurPartieEntier = strValeur

//____________________valeurPartieDecimal__________________________________
strValeur = valeurAFormate
strValeur = strValeur.substring(strValeur.indexOf('.')+1)
var valeurPartieDecimal = strValeur

valeurAFormate = valeurPartieEntier +'.'+valeurPartieDecimal
if(valeurAFormate == null){
    valeurAFormate = 0
}

return valeurAFormate

}

评论

2赞 Al Foиce ѫ 6/18/2021
虽然此代码可以回答问题,但提供有关此代码为何和/或如何回答问题的其他上下文可以提高其长期价值。
1赞 Mark Lagendijk 9/9/2021
除了缺少解释外,该代码还使用法语变量名称。
1赞 lefrost 10/8/2021 #33

您可以使用数字.js

numeral(1.341).format('0.00') // 1.34
numeral(1.345).format('0.00') // 1.35
41赞 Imbro 10/20/2021 #34

我建议你使用

new Intl.NumberFormat('de-DE', { minimumFractionDigits: 2, maximumFractionDigits: 2 }).format(num)

这样,您还将拥有您指定国家/地区的本地格式,并且它将保证显示精确的 2 位小数(无论 num 为 1 还是 1.12345,它都会分别显示 1.00 和 1.12)

在此示例中,我使用了德语本地化,因为我希望我的数字显示千位分隔符,因此这将是一些输出:

1 => 1,00
1.12 => 1,12
1.1234 => 1,12
1234 => 1.234,00
1234.1234 => 1.234,12

评论

3赞 laloune 10/22/2021
被低估的答案。这种方法可以格式化您想要的所有格式,从千位格式到小数位数
2赞 Andrew 11/24/2021
Ich küsse deine Augen.
1赞 DaveWoodall.com 1/12/2022
很好的答案。谢谢。顺便说一句:这个英文版本使用:“en-US”而不是“de-DE”
2赞 Imbro 1/18/2022
@Dave正如我所解释的那样,我故意使用德语作为非典型格式来表达观点。人们可以使用任何想要的本地化,有数百个。另一个英文示例是“en-GB”
0赞 Ivan 7/11/2022
很多,我在搜索如何格式化愚蠢的数字时浪费了两个小时。迪姆
-1赞 Nageen #35
<script src="https://code.jquery.com/jquery-3.6.0.js" integrity="sha256-H+K7U5CnXl1h5ywQfKtSj8PCmoN9aaq30gDh27Xc0jk=" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.mask/1.14.16/jquery.mask.min.js" integrity="sha512-pHVGpX7F/27yZ0ISY+VVjyULApbDlD0/X0rgGbTqCE7WFW5MezNTWG/dnhtbBuICzsd0WQPgpE4REBLv+UqChw==" crossorigin="anonymous"></script>


<input type="text" class = 'item_price' name="price" min="1.00" placeholder="Enter Price" value="{{ old('price') }}" step="">

<script> 
$(document).ready(function() {
    $('.item_price').mask('00000.00', { reverse: true });
});
</script>

评论

0赞 Antony Jones 3/10/2022
你不需要包含两个巨大的、不必要的浏览器专用库,响应 DOM 事件,并操作 DOM 来格式化一个数字。在发布之前,您应该通读其他一些答案。
-1赞 Adam Foody 4/14/2022 #36

这是我使用 epsilion 的安全解决方案。这将修复 .15 的四舍五入,例如

function myFunction(a) {

    return Math.round((a + Number.EPSILON) * 100) / 100
}
12赞 Leo Garsia 1/24/2023 #37

好消息!!!!! 似乎新版本的 javascript ES2020(我只是使用)提供了此功能的新行为。

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

如愿以偿。

0赞 Chukwuemeka Maduekwe 11/25/2023 #38

使用 JavaScript 以不同的方式处理数字,请注意 round()、toFixed() 等。 来源链接

export const preciseRound = (value, exp) => {
  /**
   * Decimal adjustment of a number.
   *
   * @param   {String}    type    The type of adjustment.
   * @param   {Number}    value   The number.
   * @param   {Integer}   exp     The exponent (the 10 logarithm of the adjustment base).
   * @returns {Number}            The adjusted value.
   */
  function decimalAdjust(type, value, exp) {
    // If the exp is undefined or zero...
    if (typeof exp === "undefined" || +exp === 0) {
      return Math[type](value);
    }
    value = +value;
    exp = +exp;
    // If the value is not a number or the exp is not an integer...
    if (isNaN(value) || !(typeof exp === "number" && exp % 1 === 0)) {
      return NaN;
    }
    // Shift
    value = value.toString().split("e");
    value = Math[type](+(value[0] + "e" + (value[1] ? +value[1] - exp : -exp)));
    // Shift back
    value = value.toString().split("e");
    return +(value[0] + "e" + (value[1] ? +value[1] + exp : exp));
  }

  // You can use floor, ceil or round
  return decimalAdjust("round", value, exp);
};
console.log(preciseRound(1.005, -2));  // <= 1.01
console.log(preciseRound(1.341, -2));  // <= 1.34
console.log(preciseRound(1.01, -2));   // <= 1.01
console.log(preciseRound(33.355, -2)); // <= 33.36