您的位置:

JavaScript中浮点数保留2位小数

一、为什么需要浮点数保留2位小数

浮点数是指数值类型,用于表示带小数部分的数值。在JavaScript中,浮点数使用64位二进制存储,由于二进制无法精确表示某些分数,因此浮点数经常会出现精度问题,导致运算结果出错。

在一些需要精确计算金额、统计数据等场景中,需要将浮点数保留2位小数。

二、toFixed()方法

在JavaScript中,使用toFixed()方法可以将一个浮点数保留指定位数的小数。该方法将浮点数转化为字符串形式,并保留指定位数的小数。例如,使用toFixed(2)方法可以将一个浮点数保留2位小数。

let num = 2.56789;
let result = num.toFixed(2); // "2.57"

需要注意的是,toFixed()方法返回的是一个字符串类型的值,如果要进行数值运算,需要使用parseFloat()或者Number()方法进行转换。

三、Math.round()方法

Math.round()方法可以将一个浮点数四舍五入到整数,并可以指定保留的小数位数。例如,使用Math.round(num * 100) / 100可以将一个浮点数保留2位小数。

let num = 2.56789;
let result = Math.round(num * 100) / 100; // 2.57

这种方法的缺点是,当要保留的小数位数 非常多时,计算量会很大。

四、Number.prototype.toFixed()方法

除了使用全局对象Math的round()函数,还可以使用Number.prototype上的toFixed()方法来实现浮点数的四舍五入保留指定位数的小数的功能。

var a = 1.23456789;
console.log(a.toFixed(2)); //"1.23"

toFixed()方法可以将数字四舍五入为指定小数位数的数字字符串。例如:a.toFixed(2)返回字符串“1.23”。

五、NUM.toFixed(n)方法

另一种方法是定义一个方法,可以对浮点数进行保留N位小数。这是一个通用的方法,而不仅仅是保留2位小数的方法。

function formatFloat(NUM, decimal) {
  let result = parseFloat(NUM);
  if (isNaN(result)) {
    return "";
  }
  result = Math.round(NUM * Math.pow(10, decimal)) / Math.pow(10, decimal); 
  let xsd = result.toString().split(".");
  if (xsd.length == 1) {
    result = result.toString() + ".";
    for (let i = 0; i < decimal; i++) {
      result = result.toString() + "0";
    }
  }
  if (xsd.length > 1) {
    if (xsd[1].length < decimal) {
      for (let i = 0; i < decimal - xsd[1].length; i++) {
        result = result.toString() + "0";
      }
    }
  }
  return result;
}

使用该方法只需要传入浮点数和需要保留的小数位数即可。

var a = 1.23456789;
console.log(formatFloat(a, 2)); //"1.23"

六、总结

在JavaScript中,浮点数经常会出现精度问题,为了保证计算的精度,需要将浮点数保留指定的小数位数。可以使用toFixed()、Math.round()或者自定义方法进行处理。

//toFixed函数 
let num = 2.56789;
let result = num.toFixed(2); // "2.57"

//Math.round函数
let num = 2.56789;
let result = Math.round(num * 100) / 100; // 2.57

//自定义函数
function formatFloat(NUM, decimal) {
  let result = parseFloat(NUM);
  if (isNaN(result)) {
    return "";
  }
  result = Math.round(NUM * Math.pow(10, decimal)) / Math.pow(10, decimal); 
  let xsd = result.toString().split(".");
  if (xsd.length == 1) {
    result = result.toString() + ".";
    for (let i = 0; i < decimal; i++) {
      result = result.toString() + "0";
    }
  }
  if (xsd.length > 1) {
    if (xsd[1].length < decimal) {
      for (let i = 0; i < decimal - xsd[1].length; i++) {
        result = result.toString() + "0";
      }
    }
  }
  return result;
}
var a = 1.23456789;
console.log(formatFloat(a, 2)); //"1.23"