JavaScript 格式化数字、金额、千分位、保留几位小数、舍入舍去… 及其浮点数计算精度问题?推荐的类库 Numeral.js 和 accounting.js

前端开发中经常会碰到用 JavaScript 格式化数字,最最常见的是格式化金额,一般格式化金额需要千分位分隔,保留2位小数等等。

还有偶然会遇到的使用 js 计算浮点数时出现误差。

完善的功能函数推荐文章(标题内容):http://www.css88.com/archives/7324#more-7324

JavaScript 浮点数计算精度问题简单解决

摘要:

由于计算机是用二进制来存储和处理数字,不能精确表示浮点数,而JavaScript中没有相应的封装类来处理浮点数运算,直接计算会导致运算精度丢失。

JavaScript 中的所有数据都是以 64 位浮点型数据(float) 来存储。所有的编程语言,包括 JavaScript,对浮点型数据的精确度都很难确定。

console.log( 0.1 + 0.2 );  //0.30000000000000004

方法一:使用 toFixed 进行四舍五入指定要保留的小数位数

console.log(( 0.1 + 0.2 ).toFixed(1));  // 0.3

缺点:其实不精确,特别对于计算金额类的严谨问题不推荐使用,且不同浏览器对其计算结果存在差异。

方法二:把需要计算的数字升级(乘以10的n次幂)成计算机能够精确识别的整数,等计算完毕再降级(除以10的n次幂),这是大部分编程语言处理精度差异的通用方法。

console.log((0.1*10 + 0.2*10)/10); // 0.3

额外:http://blog.csdn.net/u012143360/article/details/53148591

通过将浮点数转换成整数进行计算,然后再将整数的小数点位调整,转回正确的浮点数结果。

console.log(6.8-0.9);  // 5.8999999999999995
console.log(Math.round((6.8-0.9)*10)); // 59
Math.formatFloat = function (f, digit) {
var m = Math.pow(10, digit);
return Math.round(f * m, 10) / m;
};
console.log(Math.formatFloat(6.8-0.9,2)); // 5.9
12年的前辈总结:http://blog.51cto.com/xzllff/831241
13年自定义函数:https://www.cnblogs.com/wangkongming/archive/2013/01/18/2866788.html
17年css88加减乘除函数:http://www.css88.com/archives/7340