- 浏览: 3287009 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (567)
- Web前端-html/表单 (19)
- Web前端-CSS (24)
- Web前端-CSS框架 (4)
- Web前端-JS语言核心 (50)
- Web前端-JS客户端 (26)
- nodejs生态+grunt (10)
- seajs和requirejs (9)
- backbone等框架 (7)
- 模板基础 (7)
- Web前端-deps(不改动) (6)
- Web前端-component (10)
- Web前端-jquery-plugin (13)
- 浏览器兼容性 (6)
- Web前端-使用jQuery (25)
- Web前端-使用jqueryui (6)
- Web前端-性能优化 (3)
- Web协议-HTTP (6)
- ExtJS (13)
- PHP (22)
- PHP面向对象 (4)
- PHP扩展-SOAP (6)
- PHP扩展-curl (4)
- PHP与HTML(导出) (5)
- PHP扩展-综合 (7)
- mysql基础应用 (18)
- 技术心情 (18)
- 算法和面试题 (17)
- 工具(开发)使用 (36)
- memcached原理 (2)
- session和cookie (4)
- UML (2)
- Web前端_FusionCharts (5)
- Web前端_Flex (4)
- Web前端_JSP (3)
- JavaSE (10)
- JavaEE (4)
- tomcat (2)
- Servlet开发 (3)
- Spring开发 (1)
- REST相关 (2)
- 大访问量、高并发 (2)
- 网络编程 (1)
- YII (21)
- linux命令和内核 (12)
- yii与数据库 (10)
- yii与表单 (12)
- yii view层 (1)
- perl (7)
- yii扩展 (7)
- shell (4)
- photoshop (7)
- 视觉设计 (2)
- 我关注的名人在路上 (4)
- 1-自学能力 (1)
- 2-人际沟通能力 (3)
- 3-职业规划能力 (7)
- 4-项目管理能力 (2)
- python (3)
- django (4)
- Mysql高级应用 (6)
- prototype.js (4)
- Web系统安全 (1)
- Web前端-mobile (2)
- egret (6)
- jQuery源码分析 (5)
- fis (4)
最新评论
-
yzq21056563:
感谢作者分享~请教下,http://www.lisa33xia ...
CSS基础:text-overflow:ellipsis溢出文本 -
u012206458:
$.ajax的error,complete,success方法 -
DEMONU:
谢谢,虽然不能给你赞助,但是要给你顶
mysql中key 、primary key 、unique key 与index区别 -
njupt_tolmes:
阿凡达阿凡达阿凡达阿凡达阿凡达阿凡达阿凡达阿凡达阿凡达阿滕庆亚 ...
CSS基础:text-overflow:ellipsis溢出文本 -
zenmshuo:
用过SpreadJS,也包含数据可视化的图表
推荐几个web中常用js图表插件
Javascript精确计算时的bug
JS无法进行精确计算的bug
在做CRM,二代审核需求审核详情页面时。需要按比例(后端传类似0.8的小数)把用户输入的数字显示在不同的地方。
在做dubheInvest = invest * (1 - ratio);运算时发现问题。具体如下:
示例代码:
console.log( 1 - 0.8 ); //输出 0.19999999999999996
console.log( 6 * 0.7 ); //输出 4.199999999999999
console.log( 0.1 + 0.2 ); //输出 0.30000000000000004
console.log( 0.1 + 0.7 ); //输出 0.7999999999999999
console.log( 1.2 / 0.2 ); //输出 5.999999999999999
通过上面举出的例子可以看到,原生的js运算结果不一定准确,会丢失精度。
解决方案
解决方案的原理是,将浮点数乘以(扩大)10的n次方倍,把浮点数变为整数后再进行相应的运算,最后将得到的结果除以(缩小)10的n次方倍。
原理示例:
将 console.log(1-0.8); 变为 console.log((1 * 10 - 0.8 * 10) / 10); 即可得到正确的值
根据上述原理,可以封装一些方法出来解决此类问题。如下所示(Math.pow(x, y);表示求x的y次方):
如果您觉得本文的内容对您的学习有所帮助,您可以微信:
JS无法进行精确计算的bug
在做CRM,二代审核需求审核详情页面时。需要按比例(后端传类似0.8的小数)把用户输入的数字显示在不同的地方。
在做dubheInvest = invest * (1 - ratio);运算时发现问题。具体如下:
示例代码:
console.log( 1 - 0.8 ); //输出 0.19999999999999996
console.log( 6 * 0.7 ); //输出 4.199999999999999
console.log( 0.1 + 0.2 ); //输出 0.30000000000000004
console.log( 0.1 + 0.7 ); //输出 0.7999999999999999
console.log( 1.2 / 0.2 ); //输出 5.999999999999999
通过上面举出的例子可以看到,原生的js运算结果不一定准确,会丢失精度。
解决方案
解决方案的原理是,将浮点数乘以(扩大)10的n次方倍,把浮点数变为整数后再进行相应的运算,最后将得到的结果除以(缩小)10的n次方倍。
原理示例:
将 console.log(1-0.8); 变为 console.log((1 * 10 - 0.8 * 10) / 10); 即可得到正确的值
根据上述原理,可以封装一些方法出来解决此类问题。如下所示(Math.pow(x, y);表示求x的y次方):
//加 function floatAdd(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 floatSub(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); } //乘 function floatMul(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 floatDiv(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){} r1=Number(arg1.toString().replace(".","")); r2=Number(arg2.toString().replace(".","")); return (r1/r2)*Math.pow(10,t2-t1); }
如果您觉得本文的内容对您的学习有所帮助,您可以微信:
评论
1 楼
851228082
2016-04-12
加法和减法有问题。
比如
floatAdd(17.9,0.01)
17.909999999999997
减法在arg1*m、arg2*m这一步也会产生不精确。
不过,实现思路是正确,就是先转化为整数再计算。
这是我修改后的函数
/**
* float 加法
*/
function floatAdd(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}
var m =Math.pow(10,Math.max(r1,r2));
var m1=Math.pow(10,Math.max(r1,r2)-r1);
var m2=Math.pow(10,Math.max(r1,r2)-r2);
var r1_integer=Number(arg1.toString().replace(".",""))*m1;
var r2_integer=Number(arg2.toString().replace(".",""))*m2;
return (r1_integer+r2_integer)/m;
}
//减法
function floatSub(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}
var m =Math.pow(10,Math.max(r1,r2));
var m1=Math.pow(10,Math.max(r1,r2)-r1);
var m2=Math.pow(10,Math.max(r1,r2)-r2);
var r1_integer=Number(arg1.toString().replace(".",""))*m1;
var r2_integer=Number(arg2.toString().replace(".",""))*m2;
n=(r1>=r2)?r1:r2;
return Number(((r1_integer-r2_integer)/m).toFixed(n));
}
比如
floatAdd(17.9,0.01)
17.909999999999997
减法在arg1*m、arg2*m这一步也会产生不精确。
不过,实现思路是正确,就是先转化为整数再计算。
这是我修改后的函数
/**
* float 加法
*/
function floatAdd(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}
var m =Math.pow(10,Math.max(r1,r2));
var m1=Math.pow(10,Math.max(r1,r2)-r1);
var m2=Math.pow(10,Math.max(r1,r2)-r2);
var r1_integer=Number(arg1.toString().replace(".",""))*m1;
var r2_integer=Number(arg2.toString().replace(".",""))*m2;
return (r1_integer+r2_integer)/m;
}
//减法
function floatSub(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}
var m =Math.pow(10,Math.max(r1,r2));
var m1=Math.pow(10,Math.max(r1,r2)-r1);
var m2=Math.pow(10,Math.max(r1,r2)-r2);
var r1_integer=Number(arg1.toString().replace(".",""))*m1;
var r2_integer=Number(arg2.toString().replace(".",""))*m2;
n=(r1>=r2)?r1:r2;
return Number(((r1_integer-r2_integer)/m).toFixed(n));
}
发表评论
-
2015年3-6月 犯的几个小错误
2015-03-25 13:47 944作者:zccst 最近踩得坑少了,说明自己进步少了。看来以后 ... -
[知乎]那些年踩过的坑
2014-12-02 21:08 784作者:zccst 2014-12-11 toFixed 保 ... -
2014年7-12月 犯的几个小错误
2014-07-18 17:22 1219作者:zccst 这些错误不大,却很耽误时间。有时一个很小的 ... -
个人如何成长
2013-11-21 11:57 780个人成长与做项目还是 ... -
在公司生存的法则(转)
2013-11-20 20:25 850作者:zccst 1:每天11:00点前睡觉,每天7:30点 ... -
做项目体会
2013-11-20 16:26 1111别人的总结很精彩,说 ... -
万网等提供商的域名解析设置
2013-08-20 20:59 994一、万网域名解析设置 首先,在虚拟主机/云主机中绑定域名。 ... -
前端开发的几个阶段
2013-05-22 20:11 1455作者:zccst 学习js和使用jquery也有一段时间了, ... -
强势的人,强势的思维
2012-08-28 22:46 1353强势的人,强势的思维 ... -
受内伤时的心情
2012-08-15 23:25 1012作者:zccst 好久没有更新博客了,竟然浑浑噩噩的也过了,这 ... -
近期工作的几点感受
2012-04-29 00:04 1318作者:zccst 一、少承诺 ... -
老板问做完某个功能要多长时间,怎么回答
2012-03-30 16:04 1663作者:zccst 今天看到有人问:老板问做完某个功能要多长时 ... -
富人避税的秘密
2012-03-23 22:12 12作者:zccst 根据收入把人分成3部分 1,穷人 2,工薪 ... -
关于原创的基本观点
2011-07-25 13:23 959互联网的精神是分享。我想人活着最大的价值体现,也是服务于别人。 ... -
我校召开工程博士专业学位授权点申报研讨会
2011-05-26 22:42 10765月24日下午,我校组织召开了工程博士专业学位授权点申报研讨会 ... -
北航两任校长同日给力“移动云计算”
2011-03-30 20:44 12413月28日,中国科学院院 ... -
Java的三件利器
2011-03-06 21:45 1148来自xx培训学校 Java的三大利器 1,框架 —— ... -
我今天的心情
2011-02-24 17:25 1211目前的生活状态已经保持很久了,应该是从去年11月份就开始了。 ...
相关推荐
解决了js计算丢失精度的问题,稍微修改了big.js实现了连加,连减,连乘,连除。其他的请参考文档 #安装 npm的安装方式 npm install chuck-bigjs #使用方法 import Big from 'chuck-bigjs'; const number = 2; const ...
JS无法进行精确计算的bug 在做CRM,二代审核需求审核详情页面时。需要按比例(后端传类似0.8的小数)把用户输入的数字显示在不同的地方。 在做dubheInvest = invest * (1 – ratio);运算时发现问题。具体如下: ...
曾经项目用到过的,之前在网上找到此代码,但在特定条件下除法和加法运算依然会出现BUG个人对此稍作优化 代码如下://除法函数,用来得到精确的除法结果//说明:javascript的除法结果会有误差,在两个浮点数相除的...
最近在做项目的时候,涉及到产品价格的计算,经常会出现JS浮点数精度问题,这个问题,对于财务管理系统的开发者来说,是个非常严重的问题(涉及到钱相关的问题都是严重的问题),这里把相关的原因和问题的解决方案...
一、用js计算12.32 * 7 结果是多少?答案:86.24000000000001 为什么会出现这种问题?怎么解决?js在处理小数的乘除法的时候有一个bug,解决的方法可以是:将小数变为整数来处理。以上的计算可以改为:12.32 * 100 ...
当鼠标划过图形时,Highstock 可以将数据点或数据列的信息展示在提示框中,并且提示框会跟随用户的鼠标;我们做了大量工作,可以智能的显示离鼠标最近的点或被遮盖点的信息。 datetime时间轴 Highstock 对时间轴的...
js中浮点型是如何运算的呢? 例如:var a=0.69; 我想得到6.9 直接这样写 var c=a*10; alert(c)... //调用:accAdd(arg1,arg2) //返回值:arg1加上arg2的精确结果 function accAdd(arg1,arg
主要介绍了javascript解决小数的加减乘除精度丢失的方案的相关资料以及JavaScript中关于丢失数字精度的问题的探讨,非常的详细,需要的朋友可以参考下
一、用js计算 12.32 * 7 结果是多少? 答案:86.24000000000001 为什么会出现这种问题?怎么解决? js在处理小数的乘除法的时候有一个bug,解决的方法可以是:将小数变为整数来处理。 以上的计算可以改为: ...
当鼠标划过图形时,Highstock 可以将数据点或数据列的信息展示在提示框中,并且提示框会跟随用户的鼠标;我们做了大量工作,可以智能的显示离鼠标最近的点或被遮盖点的信息。 datetime时间轴 Highstock 对时间轴的...
2、修正自由签到用户无法计算请假时间、导致无法请假的BUG 3、修正设置得无公共审批人无法在审批人列表中被看到的BUG 4、修正销假后,在请假时间内依然被记录为旷工,其中: 4.1 更改请假逻辑 请假状态从请假...
我Google了一下,发现原来这是JavaScript浮点运算的一个bug。 比如:7*0.8 JavaScript算出来就是:5.6000000000000005 解决方法:网上找到了一些解决办法,就是重新写了一些浮点运算的函数。 下面就把这些方法摘录...
当鼠标划过图形时,Highcharts 可以将数据点或数据列的信息展示在提示框中,并且提示框会跟随用户的鼠标;我们做了大量工作,可以智能的显示离鼠标最近的点或被遮盖点的信息。 datetime时间轴 75% 的直角坐标系...
3、修正其它已知BUG 站长工具功能简介 1、JS加密/解密(将代码以js形式进行加密或解密。) 2、UTF-8编码转换工具(UTF-8编码转换。) 3、Unicode编码转换工具(Unicode编码转换。) 4、友情链接(通过本工具...