- 浏览: 3322509 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (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 996作者:zccst 最近踩得坑少了,说明自己进步少了。看来以后 ... -
[知乎]那些年踩过的坑
2014-12-02 21:08 827作者:zccst 2014-12-11 toFixed 保 ... -
2014年7-12月 犯的几个小错误
2014-07-18 17:22 1268作者:zccst 这些错误不大,却很耽误时间。有时一个很小的 ... -
个人如何成长
2013-11-21 11:57 820个人成长与做项目还是 ... -
在公司生存的法则(转)
2013-11-20 20:25 924作者:zccst 1:每天11:00点前睡觉,每天7:30点 ... -
做项目体会
2013-11-20 16:26 1158别人的总结很精彩,说 ... -
万网等提供商的域名解析设置
2013-08-20 20:59 1036一、万网域名解析设置 首先,在虚拟主机/云主机中绑定域名。 ... -
前端开发的几个阶段
2013-05-22 20:11 1504作者:zccst 学习js和使用jquery也有一段时间了, ... -
强势的人,强势的思维
2012-08-28 22:46 1410强势的人,强势的思维 ... -
受内伤时的心情
2012-08-15 23:25 1060作者:zccst 好久没有更新博客了,竟然浑浑噩噩的也过了,这 ... -
近期工作的几点感受
2012-04-29 00:04 1367作者:zccst 一、少承诺 ... -
老板问做完某个功能要多长时间,怎么回答
2012-03-30 16:04 1719作者:zccst 今天看到有人问:老板问做完某个功能要多长时 ... -
富人避税的秘密
2012-03-23 22:12 12作者:zccst 根据收入把人分成3部分 1,穷人 2,工薪 ... -
关于原创的基本观点
2011-07-25 13:23 1027互联网的精神是分享。我想人活着最大的价值体现,也是服务于别人。 ... -
我校召开工程博士专业学位授权点申报研讨会
2011-05-26 22:42 11205月24日下午,我校组织召开了工程博士专业学位授权点申报研讨会 ... -
北航两任校长同日给力“移动云计算”
2011-03-30 20:44 13023月28日,中国科学院院 ... -
Java的三件利器
2011-03-06 21:45 1228来自xx培训学校 Java的三大利器 1,框架 —— ... -
我今天的心情
2011-02-24 17:25 1259目前的生活状态已经保持很久了,应该是从去年11月份就开始了。 ...
相关推荐
2. **使用库**:有些库如`decimal.js`或`big.js`专门用于处理高精度浮点数计算,它们可以避免JavaScript内置的浮点数精度问题。 3. **整数运算**:对于涉及金钱计算等需要精确结果的场景,可以考虑将数值转换为整数...
解决了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而反复尝试输入。 在实际开发中,应用补丁通常涉及以下步骤: 1. 下载补丁文件,...
本文将详细介绍如何解决JavaScript中的浮点型运算BUG,并提供一些实用的函数来实现更精确的计算。 首先,我们要理解JavaScript中的浮点数运算误差。在计算机内部,浮点数是以二进制形式存储的,但不是所有十进制...
Cocos2d-x提供了基于Box2D的物理引擎,能够处理复杂的碰撞检测和物理模拟,确保炸弹爆炸时的精确效果。 5. **游戏逻辑** “炸弹超人二”的游戏逻辑包括炸弹的投掷、爆炸范围计算、角色死亡判断、得分系统、道具...
曾经项目用到过的,之前在网上找到此代码,但在特定条件下除法和加法运算依然会出现BUG个人对此稍作优化 代码如下://除法函数,用来得到精确的除法结果//说明:javascript的除法结果会有误差,在两个浮点数相除的...
【JavaScript 中文转拼音实现代码 有些bug】 在开发项目时,有时会遇到需要将中文部门名称转换成拼音的需求,特别是在没有预先存储拼音数据的情况下。本文将探讨如何使用JavaScript实现这个功能,以及解决其中可能...
JavaScript中的浮点数运算在某些情况下可能会导致不精确的结果,这是由于其内部处理机制和IEEE-754标准的特性所致。在JavaScript中,所有的数字都以Number类型存在,本质上是按照IEEE-754标准的双精度浮点数(double...
Math.js是一个强大的数学库,它提供了大量的数学函数、符号计算、复数运算、矩阵操作等功能,能有效解决精确计算的需求。 安装Math.js库非常简单,只需在项目的根目录下通过npm命令行工具执行以下命令: ```bash ...
标题:“css_bug与解决方法” 描述详述:本文旨在探讨并提供解决各种浏览器中的CSS bug的方法与技巧。在Web开发中,CSS(层叠样式表)是实现网页美观设计的关键技术之一,但不同浏览器对CSS的支持程度和解析方式...
而`popper.min.js`是Bootstrap 4引入的新依赖,用于处理定位,比如在创建弹出层时进行更精确的布局计算。 3. **核心特性**: - **栅格系统**:Bootstrap 4的栅格系统基于Flexbox,支持更灵活的布局方式,可以轻松...
**walletjs:轻松处理货币money的JS库** `walletjs` 是一个专为JavaScript开发者设计的轻量级库,主要用于处理货币相关的计算和格式化任务。在Web应用中,特别是涉及电子商务、金融或任何需要精确处理金钱数据的...
在本文中,我们将深入探讨一个在使用mpvue框架开发微信小程序时遇到的特定问题:scroll-view组件在数据更新时自动回弹至顶部的bug。针对这个问题,我们将提供一种解决方案,并解释其背后的原理。 首先,我们要了解...
3. **定位技术**:使用`position`(static, relative, absolute, fixed)来调整滑块元素的位置,尤其是滑动项在滑动时的精确控制。 4. **响应式设计**:借助媒体查询(`media queries`),可以根据设备屏幕大小调整...
因此,使用`parseFloat()`或者使用专门处理大数和精确计算的库(如`decimal.js`)可能是更好的选择。此外,使用`toFixed(n)`可以用来固定小数点后的位数,以确保显示的数值是准确的。 总的来说,理解`parseInt()`...
此bug主要出现在使用jQuery UI的resize功能时,尤其是当页面元素应用了CSS的box-sizing: border-box属性,并与Bootstrap框架一同使用时。 首先,我们需要了解box-sizing属性的两种模式:content-box和border-box。...
2. **高性能渲染**:iscroll.js 使用硬件加速来提升滚动的流畅性,尤其是在移动设备上,它可以充分利用GPU的计算能力,减少CPU的负载,提供更顺畅的用户体验。 3. **多平台支持**:iscroll.js 兼容多种浏览器和设备...