下面小编就为大家带来一篇 javascript 小数精度丢失的完美解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
原因:js 按照 2 进制来处理小数的加减乘除, 在 arg1 的基础上 将 arg2 的精度进行扩展或逆扩展匹配, 所以会出现如下情况.
javascript(js) 的小数点加减乘除问题,是一个 js 的 bug 如 0.3*1 = 0.2999999999 等,下面列出可以完美求出相应精度的四种 js 算法
- function accDiv(arg1, arg2) {
- var t1 = 0,
- t2 = 0,
- r1, r2;
- try {
- t1 = arg1.toString().split(".")[1].length
- } catch(e) {}
- try {
- t2 = arg2.toString().split(".")[1].length
- } catch(e) {}
- with(Math) {
- r1 = Number(arg1.toString().replace(".", "")) r2 = Number(arg2.toString().replace(".", "")) return accMul((r1 / r2), pow(10, t2 - t1));
- }
- }
- /* 何问起 hovertree.com */
- //乘法
- function accMul(arg1, arg2) {
- var m = 0,
- s1 = arg1.toString(),
- s2 = arg2.toString();
- try {
- m += s1.split(".")[1].length
- } catch(e) {}
- try {
- m += s2.split(".")[1].length
- } catch(e) {}
- return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m)
- }
- //加法
- function accAdd(arg1, arg2) {
- var r1, r2, m;
- try {
- r1 = arg1.toString().split(".")[1].length
- } catch(e) {
- r1 = 0
- }
- try {
- r2 = arg2.toString().split(".")[1].length
- } catch(e) {
- r2 = 0
- }
- m = Math.pow(10, Math.max(r1, r2)) return (arg1 * m + arg2 * m) / m
- }
- //减法
- function Subtr(arg1, arg2) {
- var r1, r2, m, n;
- try {
- r1 = arg1.toString().split(".")[1].length
- } catch(e) {
- r1 = 0
- }
- try {
- r2 = arg2.toString().split(".")[1].length
- } catch(e) {
- r2 = 0
- }
- m = Math.pow(10, Math.max(r1, r2));
- n = (r1 >= r2) ? r1: r2;
- return ((arg1 * m - arg2 * m) / m).toFixed(n);
- }
以上这篇 javascript 小数精度丢失的完美解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持 phperz。
来源: http://www.phperz.com/article/17/0301/265296.html