文档章节

js的浮点数加法

佣兵0926
 佣兵0926
发布于 2015/12/01 12:37
字数 773
阅读 1189
收藏 0

“浮点数”是计算机专有名词,它的权威解释感觉挺复杂,平时就是当做“小数”的别名,有“点”就是“浮点数”了。

1、问题

js计算0.1+0.2结果是:

2、网上找的解决方案

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  
}

3、本人优化

上述代码,在拿try catch当if else用,用来处理参数是整数的情况,因为整数时arg2.toString().split(".")[1]的结果是undefined,undefined.length会报错,然后catch到了之后,说明是整数,然后按照整数的情况处理。

代码倒是简洁了,但try catch是用来捕获异常的,这么做是不是有点太重了?

关于,try catch参见大牛的文章http://taobaofed.org/blog/2015/10/28/try-catch-runing-problem/

所以我把try catch改成了if else,代码:

function accAdd(arg1,arg2){  
    var r1,r2,m;
    if(parseInt(arg1)==arg1){
        r1=0;
    }else{
        r1=arg1.toString().split(".")[1].length;
    }
    if(parseInt(arg2)==arg2){
        r2=0;
    }else{
    	r2=arg2.toString().split(".")[1].length
    }
    m=Math.pow(10,Math.max(r1,r2))  
    return (arg1*m+arg2*m)/m  
}


4、方法解析

上述的加法函数大体经历了以下这些步骤:

4.1、将浮点数转化成字符串,以小数点为基准,做字符串截取操作,对小数点后的字符串,做长度计算,得到小数的位数

4.2、比较等待计算的两个数的小数位数,以小数位数最多的为基准,将两个数乘以10的相同次方,变成两个整数,做整数加法,再除以前面10的相同次方,做整10除法,得到结果

4.3、结果是,两个浮点数同时乘以一个10的若干次方,又除以这个10的若干次方,结果没变,却绕过了浮点数的计算,得到了正确结果

4.4、(arg1*m+arg2*m)/m  和arg1+arg2是相等的,这其实是小学四年级乘法分配律的反向应用,

分配律说(arg1*m+arg2*m)和(arg1+arg2)*m是相等的,

所以(arg1*m+arg2*m)/m其实和(arg1+arg2)*m/m是相等的,

(arg1+arg2)*m/m就是arg1+arg2。

饶了一圈回到原点,像是什么都没做,其实绕过了浮点数计算

PS

4.4关于“乘法分配律”的说辞,也许很多人觉得废话,想当初小学学这个时就觉得这是废话,觉得肯定是那样的,怎么还有个定律啊,可这确实就是定律,此处还是定律的反向应用,提这个确实有点怀念以往的意思。想想曾经数学的一些证明题,总觉得,tmd就是这样的,还用证明吗,可是题目就是要你证明,因为这是逻辑,想想真怀念那个时光啊

© 著作权归作者所有

共有 人打赏支持
佣兵0926
粉丝 4
博文 56
码字总数 28941
作品 0
广州
Javascript浮点数运算及比较代码收集整理

以下代码转自:http://segmentfault.com/a/1190000000324193 浮点数加法: /** ** 加法函数,用来得到精确的加法结果 ** 说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较...

Jacky.Wang
2015/10/29
0
0
js数值计算的处理,防止精度误差

(解决方法一:重写浮点运算的函数) //除法函数,用来得到精确的除法结果 //说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。 //调...

纯洁徐
2015/01/30
0
2
前端资源系列(5)-JavaScript奇味探索

JavaScript中有很多奇妙的东西,归咎or归功于设计时候的迅速。缺陷有,但是JavaScript的强大确实体现的淋漓尽致。 它是如此的灵活,当然随之而来的便是开发的代价,它不像强类型语言那样规规...

xzavier
08/27
0
0
怪异的JavaScript系列(三)

译者按: JavaScript有很多坑,经常一不小心就要写bug。 原文: What the f*ck JavaScript? 译者: Fundebug 为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学...

Fundebug
04/26
0
0
《javascript语言精粹》读书笔记(四)

本篇对这本书的附录进行摘要。 附录A:糟粕 A.1全局变量 全局变量是javascript所有糟糕特性中最糟糕的。 全局变量是在所有作用域中均可见的变量。如果某些全局变量碰巧和子程序中的变量名称相...

倪闯
2015/03/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSX | SafariBookmarksSyncAgent意外退出解决方法

1. 启动系统, 按住⌘-R不松手2. 在实用工具(Utilities)下打开终端,输入csrutil disable, 然后回车; 你就看到提示系统完整性保护(SIP: System Integrity Protection)已禁用3. 输入reboot回车...

云迹
今天
4
0
面向对象类之间的关系

面向对象类之间的关系:is-a、has-a、use-a is-a关系也叫继承或泛化,比如大雁和鸟类之间的关系就是继承。 has-a关系称为关联关系,例如企鹅在气候寒冷的地方生活,“企鹅”和“气候”就是关...

gackey
今天
4
0
读书(附电子书)|小狗钱钱之白色的拉布拉多

关注公众号,在公众号中回复“小狗钱钱”可免费获得电子书。 一、背景 之前写了一篇文章 《小狗钱钱》 理财小白应该读的一本书,那时候我才看那本书,现在看了一大半了,发现这本书确实不错,...

tiankonguse
今天
4
0
Permissions 0777 for ‘***’ are too open

异常显示: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: UNPROTECTED PRIVATE KEY FILE! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ......

李玉长
今天
5
0
区块链10年了,还未落地,它失败了吗?

导读 几乎每个人,甚至是对通证持怀疑态度的人,都对区块链的技术有积极的看法,因为它有可能改变世界。然而,区块链技术问世已经10年了,我们仍然没有真正的用上区块链技术。 几乎每个人,甚...

问题终结者
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部