文档章节

js的浮点数加法

佣兵0926
 佣兵0926
发布于 2015/12/01 12:37
字数 773
阅读 1192
收藏 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
JavaScript 浮点数运算的精度问题

在 JavaScript 中整数和浮点数都属于 数据类型,所有数字都是以 64 位浮点数形式储存,即便整数也是如此。 所以我们在打印 这样的浮点数的结果是 而非 。在一些特殊的数值表示中,例如金额,...

xiaogg
01/07
0
0
前端资源系列(5)-JavaScript奇味探索

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

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

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

Fundebug
2018/04/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 白掌柜说了卖货不卖身

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @爱漫爱 :这是一场修行分享羽肿的单曲《Moony》 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :开不开心? 开心呀, 我又不爱睡懒觉…...

小小编辑
今天
8
0
大数据教程(11.7)hadoop2.9.1平台上仓库工具hive1.2.2搭建

上一篇文章介绍了hive2.3.4的搭建,然而这个版本已经不能稳定的支持mapreduce程序。本篇博主将分享hive1.2.2工具搭建全过程。先说明:本节就直接在上一节的hadoop环境中搭建了! 一、下载apa...

em_aaron
今天
3
0
开始看《JSP&Servlet学习笔记》

1:WEB应用简介。其中1.2.1对Web容器的工作流程写得不错 2:编写Servlet。搞清楚了Java的Web目录结构,以及Web.xml的一些配置作用。特别是讲了@WebServlet标签 3:请求与响应。更细致的讲了从...

max佩恩
今天
4
0
mysql分区功能详细介绍,以及实例

一,什么是数据库分区 前段时间写过一篇关于mysql分表的的文章,下面来说一下什么是数据库分区,以mysql为例。mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可...

吴伟祥
今天
3
0
SQL语句查询

1.1 排序 通过order by语句,可以将查询出的结果进行排序。放置在select语句的最后。 格式: SELECT * FROM 表名 ORDER BY 排序字段ASC|DESC; ASC 升序 (默认) DESC 降序 1.查询所有商品信息,...

stars永恒
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部