格式编号始终显示2位小数

时间:2011-05-26 05:22:51

标签: javascript floating-point number-formatting

我想格式化我的数字,以便始终显示2位小数,在适用的地方进行舍入。

示例:

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

我一直在用这个:

parseFloat(num).toFixed(2);

但它显示11,而不是1.00

32 个答案:

答案 0 :(得分:916)

这在FF4中运行良好:

parseFloat(Math.round(num3 * 100) / 100).toFixed(2);

现场演示

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

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

var num3 = "1.345";
document.getElementById('num3').innerHTML = parseFloat(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.346将返回1.35

答案 1 :(得分:260)

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>

答案 2 :(得分:77)

如果value = 1.005

This answer将会失败。

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

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

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

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

信用:Rounding Decimals in JavaScript

答案 3 :(得分:18)

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

答案 4 :(得分:12)

用于舍入到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

答案 5 :(得分:12)

最简单的答案:

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

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

答案 6 :(得分:11)

要获得最准确的舍入,请创建此函数:

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

并用它来舍入到2位小数:

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

感谢Razuthis文章和MDN's Math.round reference

答案 7 :(得分:9)

如果您已经在使用jQuery,可以使用jQuery Number Format插件。

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

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

您还可以获得jQuery Number Format from GitHub

答案 8 :(得分:9)

var number = 123456.789;


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

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

答案 9 :(得分:7)

这是你的意思吗?

function showAsFloat(num, n){
      return !isNaN(+num) ? (+num).toFixed(n || 2) : num;
}

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)      | ' + showAsFloat('2456198', 5),
     'showAsFloat(0);              | ' + showAsFloat(0)
    ].join('\n');
<pre id="result"></pre>

答案 10 :(得分:6)

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

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

n的结果将是:

5.57

答案 11 :(得分:4)

你在寻找地板吗?

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

答案 12 :(得分:3)

这里也是一个通用函数,可以格式化为任意数量的小数位:

function numberFormat(val, decimalPlaces) {

    var multiplier = Math.pow(10, decimalPlaces);
    return (Math.round(val * multiplier) / multiplier).toFixed(decimalPlaces);
}

答案 13 :(得分:3)

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

有关舍入和格式化的详细说明,请访问:http://www.merlyn.demon.co.uk/js-round.htm#RiJ

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

答案 14 :(得分:2)

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

答案 15 :(得分:2)

&#13;
&#13;
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;
&#13;
#format{
display:inline-block;
padding:10px;
border:1px solid #ddd;
background:#f5f5f5;
}
&#13;
<div id='format'>Test 123456789</div>
&#13;
&#13;
&#13;

答案 16 :(得分:1)

var quantity = 12;

var import1 = 12.55;

var total = quantity * import1;

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

document.write(answer);

答案 17 :(得分:1)

你没有给我们全面的了解。

当我将其粘贴到位置栏时,

javascript:alert(parseFloat(1).toFixed(2))在浏览器中显示1.00。 但是,如果你之后做了什么,它将恢复。

var num = 2
document.getElementById('spanId').innerHTML=(parseFloat(num).toFixed(2)-1)


shows 1 and not 1.00

答案 18 :(得分:1)

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

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

让我知道是否有人可以戳洞

答案 19 :(得分:1)

我必须先进行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输入类型是“数字”,但用户输入实际上是“字符串”数据类型。但是,toFixed()函数只能在数字对象上调用。

我的最终代码如下:

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

我偏爱使用Number()与parseFloat()进行转换的原因是因为我既不必为空的输入字符串也不为NaN值执行额外的验证。 Number()函数将自动处理一个空字符串并将其隐藏为零。

答案 20 :(得分:0)

java.lang.RuntimeException: EJB Container initialization error
    at org.glassfish.ejb.startup.EjbApplication.loadContainers(EjbApplication.java:210)
    at org.glassfish.ejb.startup.EjbDeployer.load(EjbDeployer.java:267)
    at org.glassfish.ejb.startup.EjbDeployer.load(EjbDeployer.java:75)
java.lang.RuntimeException: EJB Container initialization error
    at org.glassfish.ejb.startup.EjbApplication.loadContainers(EjbApplication.java:210)
    at org.glassfish.ejb.startup.EjbDeployer.load(EjbDeployer.java:267)
    at org.glassfish.ejb.startup.EjbDeployer.load(EjbDeployer.java:75)
  Exception while loading the app : EJB Container initialization error
java.lang.Exception
    at com.sun.enterprise.connectors.inbound.ConnectorMessageBeanClient.setup(ConnectorMessageBeanClient.java:189)
    at org.glassfish.ejb.mdb.MessageBeanContainer.<init>(MessageBeanContainer.java:227)
    at org.glassfish.ejb.mdb.MessageBeanContainerFactory.createContainer(MessageBeanContainerFactory.java:39)
    at org.glassfish.ejb.startup.EjbApplication.loadContainers(EjbApplication.java:198)
    at org.glassfish.ejb.startup.EjbDeployer.load(EjbDeployer.java:267)
    at org.glassfish.ejb.startup.EjbDeployer.load(EjbDeployer.java:75)

}

答案 21 :(得分:0)

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是符号,i是整数部分,d是点后的前两位数字,r是其他数字(我们使用r[0]值取整)
  • k包含有关最后两位数字(表示为整数)的信息
  • 如果r[0]>=5,那么我们将1加到d-但是如果我们有负数(s=='-')和{{1} }精确等于5,那么在这种情况下,我们减去1(出于兼容性原因-r以负数形式工作,例如Math.round
  • 之后,如果后两位数字Math.round(-1.5)==-1大于99,则我们将整数k加一位

答案 22 :(得分:0)

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>

答案 23 :(得分:0)

您可以尝试以下代码:

    function FormatNumber(number, numberOfDigits = 2) {
        try {
            return new Intl.NumberFormat('en-US').format(parseFloat(number).toFixed(2));
        } 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.56

答案 24 :(得分:0)

function numberWithCommas(number){

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

return newval.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");

}

答案 25 :(得分:0)

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

Math.floor(num* 100 )/100;

答案 26 :(得分:0)

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

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

将语言环境标签指定为控制decimal separator的第一个参数。对于点,请使用例如美国英语语言环境:

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

给出:

  

1.35

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

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

它将给出:

  

1,35

答案 27 :(得分:0)

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

答案 28 :(得分:0)

使用精确度方法

扩展数学对象

&#13;
&#13;
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
)
&#13;
&#13;
&#13;

答案 29 :(得分:0)

我喜欢:

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

用2位小数舍入数字, 然后确保用parseFloat()解析它 返回Number,而不是String,除非你不关心它是字符串还是数字。

答案 30 :(得分:-2)

(num + "").replace(/^([0-9]*)(\.[0-9]{1,2})?.*$/,"$1$2")

答案 31 :(得分:-3)

这就是我解决问题的方法:

parseFloat(parseFloat(floatString).toFixed(2));