一、为什么需要浮点数保留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"