文档章节

js的浮点数加法

佣兵0926
 佣兵0926
发布于 2015/12/01 12:37
字数 773
阅读 1184
收藏 0
点赞 1
评论 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系列(三)

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

Fundebug ⋅ 04/26 ⋅ 0

WEB前端开发学习:你思考过为什么JavaScript计算浮点数不准确吗?

Web前端开发工程师是一个很新的职业,是从事Web前端开发工作的工程师。主要进行网站开发,优化,完善的工作。网页制作是Web 1.0时代的产物,那时网站的主要内容都是静态的,用户使用网站的行...

web前端小辰 ⋅ 06/03 ⋅ 0

你不懂js系列学习笔记-异步与性能- 05

第五章: 程序性能 原文:You-Dont-Know-JS 这本书至此一直是关于如何更有效地利用异步模式。但是我们还没有直接解释为什么异步对于 JS 如此重要。最明显明确的理由就是 性能。 举个例子,如果...

寇格莫 ⋅ 05/22 ⋅ 0

JavaScript 编程精解 中文第三版 一、值,类型和运算符

一、值,类型和运算符 原文:Values, Types, and Operators 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 部分参考了《JavaScript 编程精解(第 2 版)》 在机器的表面之下,程序在...

apachecn_飞龙 ⋅ 04/29 ⋅ 0

隐藏在 Node.js 浮点反序列化错误背后的故事

原文作者:孝达 在 Node.js 中,当我们把一个浮点数序列化,再反序列化: 我们会发现,再也取不出之前的值了: 然而,如果再序列化回去,发现结果还是相同的: 我勒个去!What happened? 排...

_朴灵_ ⋅ 05/14 ⋅ 0

JavaScript的高精度计算与JSON.parse的BIGINT

在JavaScript处理整数的时候会遇到某些特别奇怪的问题,比如后台给你返回了一个超长的数字,然后js在计算的时候突然发现计算不对,不是后面为0就是计算得不到想要的结果.这里涉及到一个很简单的...

relsoul ⋅ 05/10 ⋅ 0

怪异的JavaScript系列(一)

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

Fundebug ⋅ 04/24 ⋅ 0

Javascript数值转换(string,int,json)

数值: 在JavaScript中,数值转换一般有三种方式: 一、Number(param)函数:param可以用于任何数据类型 1.1 param是Boolean值,true和false分别转换为1和0; 1.2 param是数值,只是简单的传入...

easonjim ⋅ 2016/12/27 ⋅ 0

怪异的JavaScript系列(二)

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

Fundebug ⋅ 04/25 ⋅ 0

浅谈 instanceof 和 typeof 的实现原理

typeof 实现原理 一般被用于判断一个变量的类型,我们可以利用 来判断, , , , , , 这七种类型,这种判断能帮助我们搞定一些问题,比如在判断不是 object 类型的数据的时候,能比较清楚的告诉...

nicole_zhang ⋅ 05/28 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

如何解决s权限位引发postfix及crontab异常

一、问题现象 业务反馈某台应用服务器,普通用户使用mutt程序发送邮件时,提示“postdrop warning: mail_queue_enter: create file maildrop/713410.6065: Permission denied”,而且普通用法...

问题终结者 ⋅ 27分钟前 ⋅ 0

Unable to load database on disk

由于磁盘空间满了以后,导致zookeeper异常退出,清理磁盘空间后,zk启动报错,信息如下: 2018-06-25 17:18:46,904 INFO org.apache.zookeeper.server.quorum.QuorumPeerConfig: Reading co...

刀锋 ⋅ 47分钟前 ⋅ 0

css3 box-sizing:border-box 实现div一行多列

<!DOCTYPE html><html><head><style> div.container{ background:green; padding:10px 10px;}div.box{box-sizing:border-box;-moz-box-sizing:border-box; /* Fir......

qimh ⋅ 52分钟前 ⋅ 0

Homebrew简介和基本使用

一、Homebrew是什么 Homebrew是一款Mac OS平台下的软件包管理工具,拥有安装、卸载、更新、查看、搜索等很多实用的功能。简单的一条指令,就可以实现包管理,而不用你关心各种依赖和文件路径...

说回答 ⋅ 59分钟前 ⋅ 0

文件压缩和打包zip、tar

第六章 文件压缩和打包 6.5 zip压缩工具 zip命令可以用来解压缩文件,或者对文件进行打包操作。zip是个使用广泛的压缩程序,文件经它压缩后会另外产生具有“.zip”扩展名的压缩文件。 注意:...

弓正 ⋅ 今天 ⋅ 0

vuex

一、状态对象如何赋值给内部对象。三种方式: 1、使用computed赋值,一定要写this,不然找不到$store。 computed:{ count(){ return this.$store.state.count; }} 2、通...

大美琴 ⋅ 今天 ⋅ 0

javaScript 设计模式

1、构造函数模式 ` /** 构造一个动物的函数 */ function Animal(name, color){ this.name = name; this.color = color; this.getName = function(){ return this.name; } } // 实例一个对象 ......

fangPeng_ ⋅ 今天 ⋅ 0

日常嘚瑟:TeamCity构建中解压和打包tar

要弄一个新的构建,很简单,从两个构建的tar格式Artifact中分别取一部分,重新打一个tar。 所以,我去写个脚本用curl下载两个依赖的Artifact,然后解压移动重新打个tar? 开什么玩笑,我的技...

谷永权 ⋅ 今天 ⋅ 0

Istio官方文档中文版

阅读目录 Istio官方文档中文版 回到目录 Istio官方文档中文版 http://istio.doczh.cn/ https://istio.io/docs/concepts/what-is-istio/goals.html 为什么要使用Istio? 在从单体应用程序向分...

xiaomin0322 ⋅ 今天 ⋅ 0

CentOS 7 Omnibus 包安装 GitLab 并汉化记录

系统环境 操作系统:CentOS 7GitLab:gitlab-ce-10.8.4-ce.0.el7.x86_64.rpm 下载Omnibus安装包 使用国内镜像加速下载地址 # wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el......

admin_qing ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部