我想最多四舍五入两位小数,但只有在必要时。

输入:

10
1.7777777
9.1

输出:

10
1.78
9.1

如何在JavaScript中执行此操作?


当前回答

2017只需使用本机代码.toFixed()

number = 1.2345;
number.toFixed(2) // "1.23"

如果您需要严格要求并在需要时添加数字,可以使用替换

number = 1; // "1"
number.toFixed(5).replace(/\.?0*$/g,'');

其他回答

所有浏览器和精度的通用答案:

function round(num, places) {
    if(!places) {
        return Math.round(num);
    }

    var val = Math.pow(10, places);
    return Math.round(num * val) / val;
}

round(num, 2);

有两种方法可以做到这一点。对于像我这样的人,Lodash的变体

function round(number, precision) {
    var pair = (number + 'e').split('e')
    var value = Math.round(pair[0] + 'e' + (+pair[1] + precision))
    pair = (value + 'e').split('e')
    return +(pair[0] + 'e' + (+pair[1] - precision))
}

用法:

round(0.015, 2) // 0.02
round(1.005, 2) // 1.01

如果您的项目使用jQuery或Lodash,您也可以在库中找到适当的舍入方法。

MarkG和Lavamantis提供了一个比已被接受的解决方案更好的解决方案。很遗憾他们没有得到更多的支持票!

这是我用来解决浮点小数问题的函数,也是基于MDN的。它甚至比Lavamantis的解决方案更通用(但不够简洁):

function round(value, exp) {
  if (typeof exp === 'undefined' || +exp === 0)
    return Math.round(value);

  value = +value;
  exp  = +exp;

  if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0))
    return NaN;

  // Shift
  value = value.toString().split('e');
  value = Math.round(+(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));
}

将其用于:

round(10.8034, 2);      // Returns 10.8
round(1.275, 2);        // Returns 1.28
round(1.27499, 2);      // Returns 1.27
round(1.2345678e+2, 2); // Returns 123.46

与拉瓦曼蒂斯的解决方案相比,我们可以做到。。。

round(1234.5678, -2); // Returns 1200
round("123.45");      // Returns 123

数学基础和圆定义:

带我们去

让舍入=x=>(x+0.05-(x+0.05)%0.01+'')。替换(/(\…)(.*)/,'1');//对于像1.384这样的情况,我们需要使用正则表达式来获取点后的2位数字//和切断机器误差(epsilon)console.log(圆形(10));控制台日志(圆形(1.777777));console.log(圆形(1.7747777));console.log(圆形(1.384));

parseFloat(“1.555”).toFixed(2);//返回1.55而不是1.56。

1.55是绝对正确的结果,因为在计算机中不存在1.555的精确表示。如果读数为1.555,则四舍五入至最接近的值=1.55499999999999994(64位浮点)。将这个数字四舍五入到Fixed(2)得到1.55。

如果输入为1.55499999999999,则此处提供的所有其他功能都会给出故障结果。

解决方案:在扫描前加上数字“5”,将数字舍入(更准确地说,从0开始舍入)。仅当数字真的是浮点(有小数点)时才执行此操作。

parseFloat("1.555"+"5").toFixed(2); // Returns 1.56