解决javascript加减乘除及toFixed的误差问题

 1     //用于替换原有的toFixed,解决精度误差问题
 2     Number.prototype.myToFixed=function(s){
 3       if(s == null){s = 0;}
 4       var value = Math.pow(10,s);//Math.pow(x,y)返回 x 的 y 次幂的值,即10的len次方的值
 5       //javascript的加减乘除结果会有误差,使用自定义方法
 6       var returnStr = Math.round(this.mul(value)).div(value).toString();
 7       //var returnStr=(parseInt(this * value + 0.5)/ value).toString();
 8       var pointIndex = returnStr.indexOf(".");
 9       if(pointIndex < 0 && s > 0){//如果没有小数点,先添加小数点,再补0
10         returnStr = returnStr + ".";
11         for(i = 0; i < s; i++){
12           returnStr = returnStr + "0";
13         }
14       }else {
15         var weishu = returnStr.length - 1 - pointIndex;
16         for(i = 0; i < ( s - weishu ); i++){//如果有小数点,直接补缺少的0
17           returnStr = returnStr + "0";
18         }
19       }
20       return returnStr;
21     }
 1     //乘法函数,用来得到精确的乘法结果
 2     //说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
 3     //调用:accMul(arg1,arg2)
 4     //返回值:arg1乘以arg2的精确结果
 5     function accMul(arg1, arg2) {
 6         var m = 0, s1 = arg1.toString(), s2 = arg2.toString();
 7         try { m += s1.split(".")[1].length } catch (e) { }
 8         try { m += s2.split(".")[1].length } catch (e) { }
 9         return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m)
10     }
11     //用法:
12     //给Number类型增加一个mul方法,调用起来更加方便。
13     Number.prototype.mul = function (arg) {
14         return accMul(this,arg);
15     }
 1     //除法函数,用来得到精确的除法结果
 2     //说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
 3     //调用:accDiv(arg1,arg2)
 4     //返回值:arg1除以arg2的精确结果
 5     function accDiv(arg1, arg2) {
 6         var t1 = 0, t2 = 0, r1, r2;
 7         try { t1 = arg1.toString().split(".")[1].length } catch (e) { }
 8         try { t2 = arg2.toString().split(".")[1].length } catch (e) { }
 9         with (Math) {
10             r1 = Number(arg1.toString().replace(".", ""))
11             r2 = Number(arg2.toString().replace(".", ""))
12             return (r1 / r2) * pow(10, t2 - t1);
13         }
14     }
15     //用法:
16     //给Number类型增加一个div方法,调用起来更加方便。
17     Number.prototype.div = function (arg) {
18         return accDiv(this,arg);
19     }
 1     //加法函数,用来得到精确的加法结果
 2     //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
 3     //调用:accAdd(arg1,arg2)
 4     //返回值:arg1加上arg2的精确结果
 5     function accAdd(arg1, arg2) {
 6         var r1, r2, m;
 7         try { r1 = arg1.toString().split(".")[1].length } catch (e) { r1 = 0 }
 8         try { r2 = arg2.toString().split(".")[1].length } catch (e) { r2 = 0 }
 9         m = Math.pow(10, Math.max(r1, r2))
10         return (arg1 * m + arg2 * m) / m
11     }
12     //用法:
13     //给Number类型增加一个add方法,调用起来更加方便。
14     Number.prototype.add = function (arg) {
15         return accAdd(arg, this);
16     }
 1     //减法函数,用来得到精确的减法结果
 2     function Subtr(arg1, arg2) {
 3         var r1, r2, m, n;
 4         try { r1 = arg1.toString().split(".")[1].length } catch (e) { r1 = 0 }
 5         try { r2 = arg2.toString().split(".")[1].length } catch (e) { r2 = 0 }
 6         m = Math.pow(10, Math.max(r1, r2));
 7         //last modify by deeka
 8         //动态控制精度长度
 9         n = (r1 >= r2) ? r1 : r2;
10         return ((arg1 * m - arg2 * m) / m).toFixed(n);//这里竟然用了toFixed
11     }

计算尽量少在页面用js计算,尽量在后台计算,实在要用js又不想有误差,就可以上面的方法了。

时间: 2024-10-10 15:43:33

解决javascript加减乘除及toFixed的误差问题的相关文章

javascript避免数字计算精度误差的方法详解

本篇文章主要是对javascript避免数字计算精度误差的方法进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 如果我问你 0.1 + 0.2 等于几?你可能会送我一个白眼,0.1 + 0.2 = 0.3 啊,那还用问吗?连幼儿园的小朋友都会回答这么小儿科的问题了.但是你知道吗,同样的问题放在编程语言中,或许就不是想象中那么简单的事儿了.不信?我们先来看一段 JS. var numA = 0.1; var numB = 0.2; alert( (numA + numB) === 0.3

如何解决JavaScript中0.1+0.2不等于0.3

console.log(0.1+0.2===0.3)// true or false?? 在正常的数学逻辑思维中,0.1+0.2=0.3这个逻辑是正确的,但是在JavaScript中0.1+0.2!==0.3,这是为什么呢?这个问题也会偶尔被用来当做面试题来考查面试者对 JavaScript的数值的理解程度. 在JavaScript中的二进制的浮点数0.1和0.2并不是十分精确,在他们相加的结果并非正好等于0.3,而是一个比较接近的数字 0.30000000000000004 ,所以条件判断结果

解决JavaScript中批量添加事件的问题

这是JavaScript中一个老生常谈的问题,也是初学者较难理解的问题.当给一系列元素添加事件时,常常会出现一些我们不希望出现的问题.例如以下代码: //给li元素批量添加click事件 window.onload = function(){ var lists = document.getElementsByTagName("li"); for(var i=0;i<lists.length;i++){ lists[i].onclick = function(){ alert(i

用javascript加减乘除

<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <title></title> <style> </style></head><body><div> <input type="text" size="10" id=&q

解决JavaScript的属性innerHTML不能在页面交互时输出的问题(转载)

注:问题:JavaScript的innerHTML不能在页面交互时输出(即人机实时交互数据不能通过javascript的innerHTML属性输出) 解决方案:自建一个函数:set_innerHTML(obj_id, html, time). 有了这个方法,原来这样写:     document.getElementById("sch_nameArea").innerHTML= text 的地方就可以写成这样: set_innerHTML('sch_nameArea',text); s

解决Javascript大数据列表引起的网页加载慢/卡死问题。

在一些网页应用中,有时会碰到一个超级巨大的列表,成千上万行,这时大部份浏览器解析起来就非常痛苦了(有可能直接卡死). 也许你们会说可以分页或动态加载啊?但是有可能需求不允许分页,动态加载?网络的延迟也会造成体验不好. 那么适时候介绍本文的实现思路了. 首先上最终的效果: 主要思路如下: 首先,创建如上图所示的三个DIV,scrollbar用于显示具体的滚动条(CSS需要设置zindex,要显示在demo-list的底层),real-panel用于计算列表的实际高度(每一个li的高度是固定的,有多

WebSocket 解决javascript跨域问题一剂良药

近日做项目中遇到javascript跨域问题,父页面和子页面要通信,并且父子页面跨域,怎么办? 大家结合以前经验,想到了Websocket,websocket客户端编程比较简单,服务端我们用Java实现, 项目中要保证父子页面通信是点对点,需要在服务端建立对父子页面WebSocket的对应关系,即父 页面发的消息只被子页面收到,子页面的消息也只被父页面收到我们做了以下工作,严格保证了 WebSocket通信是点对点: 一是建立WebSocket链接的URL加上时间戳保证通信会话是唯一的: 二是在

解决Javascript中$(window).resize()多次执行

有些时候,我们需要在浏览器窗口发生变化的时候,动态的执行一些操作,比如做自适应页面时的适配.这个时候,我们需要在窗口拖动的时候去执行代码.但是有些时候,执行的操作比较复杂,我们只希望在窗口拖动完毕之后,在执行代码,否则极容易造成浏览器假死状态,这个时候该如何解决呢. 浏览器窗口发生改变 先来写一下窗口拖动时执行代码的函数,原生JS可用window.onresize Jquery可用$(window).resize(). window.onresize = function(){ console.

SICP 锻炼 (2.15)解决摘要:深入思考间隔误差

SICP 2.15 是接着 题目 2.14 的, 题目 2.14中提到了Alyssa设计的区间计算模块在并联电阻计算时会出现故障,这个问题是Lem发现的. 接着,一个叫Eva的人也发现了这个问题.同一时候她还有更深入的思考. Eva认为.假设一个公式能够写成一种形式,当中具有非准确性的变量不反复出现.那么Alyssa的系统产生的区间的限界会更紧一些. 因此,她认为在计算并联电阻时,公式"1/(1/R1 + 1/R2)"比公式"(R1*R2)/ (R1 + R2)"要