javascript浮点数运算修正

众所周知,javascript对于浮点数的运算一直都是有问题的,比如0.2+0.1 结果是 0.30000000000000004。

下面是我的解决方案,先贴代码了:

var calMath = (function() {
    var isFloat = function(a) {
        var reg = /\d.\d+/g
        return reg.test(a)
    }
    var getFloatDigit = function(a) {
        var digit, len
        a = a.toString()
        digit = a.split(".")
        len = digit[1] == undefined ? 0 : digit[1].length
        return len
    }
    var allArithmetic = function(type, a, b) {
        var c, gfd_a, gfd_b, baseLen, baseMulti
        var a = Number(a),
            b = Number(b)
        if (isFloat(a) || isFloat(b)) {
            gfd_a = getFloatDigit(a)
            gfd_b = getFloatDigit(b)
            baseLen = gfd_a >= gfd_b ? gfd_a : gfd_b
            baseMulti = Math.pow(10, baseLen)
            a = type != "add" ? Number(a.toString().replace(".", "")) : a
            b = type != "add" ? Number(b.toString().replace(".", "")) : b
            if (type == "add") {
                c = ((a * baseMulti + b * baseMulti) / baseMulti).toFixed(baseLen)
            } else if (type == "multi") {
                c = (a * b) / Math.pow(10, gfd_a + gfd_b)
            } else if (type == "divi") {
                c = ((a / b) * Math.pow(10, gfd_b - gfd_a))
            }
        } else {
            if (type == "add") {
                c = a + b
            } else if (type == "multi") {
                c = a * b
            } else if (type == "divi") {
                c = a / b
            }
        }
        return c
    }
    return {
        add: function(a, b) {
            return allArithmetic("add", a, b)
        },
        sub: function(a, b) {
            return allArithmetic("add", a, -b)
        },
        multi: function(a, b) {
            return allArithmetic("multi", a, b)
        },
        divi: function(a, b) {
            return allArithmetic("divi", a, b)
        }
    }
})()

思路就是:

1. 判定是否是浮点数。

2. 如果不是浮点数,就选择常规的运算方法。

3. 如果是浮点数,则先取浮点数后面个数(即小数点的位数)。

4. 如果是浮点数的加减法运算,则比较他们小数点后的位数,取较大的那个,暂且称之为n,这个数有什么用呢?就是先让我们的浮点数都变成整数(小数乘以10的n次方),然后在重新变成浮点数(结果再除以10的n次方),整数做加减法总没事了吧?其实并不一定,有些情况,浮点数乘以10的次方时,出来的数也会有“尾巴”,但是这个“尾巴”的误差相对来说比较小,所以我们利用toFixed(n)来处理掉它就ok了。

5. 如果是浮点数的乘法运算,其实思路跟上面的类似,先将他们小数点后的位数相加,取得的值继续叫他小n吧,小n暂且不管他,我们这里换种让浮点数变成整数的方式,就是直接把小数点给去掉,理由就是刚刚在加减法时提到的,如果用10的n次方让小数变整数,其实有可能出现误差很小的浮点数的,那在加减法中我们可以有补救措施,但是在乘法中,一个点0.00000000x的小数出现了之后,再补救就不可能了。那我们这里的小n有什么用呢,当然是把整数再变回小数啦。

6. 如果是浮点数的除法运算,思路跟乘法基本一致,看着代码自己思考吧。

console.log(calMath.add(0.2,0.1)) //结果是0.3哦

时间: 2024-10-26 09:00:26

javascript浮点数运算修正的相关文章

【转】javascript 浮点数运算问题

大多数语言在处理浮点数的时候都会遇到精度问题,但是在JS里似乎特别严重,来看一个例子 alert(45.6*13); 结果居然是592.800000000001,当然加法之类的也会有这个问题 那这是js的错误吗? 当然不是,你的电脑做着正确的二进制浮点运算,但问题是你输入的是十进制的数,电脑以二进制运算,这两者并不是总是转化那么好的,有时候会得到正确的结果,但有时候就不那么幸运了 alert(0.7+0.1);//输出0.7999999999999999 alert(0.6+0.2);//输出0

JavaScript 浮点数运算 精度问题

JavaScript小数在做四则运算时,精度会丢失,这会在项目中引起诸多不便,先请看下面脚本. 1 //加减 2 <script type="text/javascript" language="javascript"> 3 alert(1/3);//弹出: 0.3333333333333333 4 alert(0.09999999 + 0.00000001);//弹出: 0.09999999999999999 5 alert(-0.09999999 -

Javascript浮点数运算及比较代码收集整理

以下代码转自:http://segmentfault.com/a/1190000000324193 浮点数加法: /**  ** 加法函数,用来得到精确的加法结果  ** 说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显.这个函数返回较为精确的加法结果.  ** 调用:accAdd(arg1,arg2)  ** 返回值:arg1加上arg2的精确结果  **/ function accAdd(arg1, arg2) {         var r1, r2, m, 

【javascript】浮点数运算问题分析及解决方法

问题: 在用 js 进行小数四则运算时发现了一个重大问题,比如:0.7 * 0.8 = 0.5599999999999999 分析: 在 js 中只有一种数字类型 Number,而且在 js 中所有的数字都是以 IEEE-754 标准格式表示的.浮点数的精度问题并不是 js 特有的,因为有些小数以二进制表示位数是无穷的,比如 1.1,其程序实际上无法真正的表示 1.1,而只能做到一定程度上的准确(1.09999999999999999),这是无法避免的精度丢失. 通过 chrome 控制台,我们

JavaScript 浮点数及运算精度调整总结

JavaScript 浮点数及运算精度调整总结 JavaScript 只有一种数字类型 Number,而且在Javascript中所有的数字都是以IEEE-754标准格式表示的.浮点数的精度问题不是JavaScript特有的,因为有些小数以二进制表示位数是无穷的. 作者:来源:theWalker|2015-12-02 10:21 移动端 收藏 分享 [技术沙龙]AI开发者实战营-7分钟打造1个定制技能.7月22号,我们等你一起! JavaScript 只有一种数字类型 Number,而且在Jav

javascript浮点数计算的问题

在使用javascript进行浮点数计算的时候经常会出现各种怪异的问题, 比如7*0.4 js计算结果为:2.8000000000000003. 所以在使用js计算的时候就需要一些特殊处理,思路就是先把js中的数 值扩大到相应的倍数,去掉小数部分再进行计算. var SysRf = SysRf || {}; SysRf.strNum = {}; //浮点数加法运算 SysRf.strNum.add = function(arg1, arg2) { var r1,r2,m; try{r1=arg1

浮点数运算和金额处理

做一个用户中奖记录页面,展示每条记录和总金额,遇到浮点数相加出现问题. Js的浮点数在比较或者做运算的时候会不准确,这个只在初学js的时候读到过概念性的东西,这次就遇到了就在这里记一笔,做一下相关拓展,网上处理的方法也很多,这里摘要一些博主的. 浮点数运算: 转自:https://blog.csdn.net/u013347241/article/details/79210840 思路是将小数转成整数来运算,之后再转回小数. 'use strict' var accAdd = function(n

程序员必知之浮点数运算原理详解

导读:浮点数运算是一个非常有技术含量的话题,不太容易掌握.许多程序员都不清楚使用==操作符比较float/double类型的话到底出现什么问题. 许多人使用float/double进行货币计算时经常会犯错.这篇文章是这一系列中的精华,所有的软件开发人员都应该读一下. 随着你经验的增长,你肯定 想去深入了解一些常见的东西的细节,浮点数运算就是其中之一. 1. 什么是浮点数? 在计算机系统的发展过程中,曾经提出过多种方法表达实数. [1]典型的比如相对于浮点数的定点数(Fixed Point Num

记C语言浮点数运算处理 "坑" 一则

看一小段C语言程序: int main() { float x = 1.3; x = x - (int)x; int i = (int)(x*10); return 0; } 在你心目中, 变量 I 是怎样的结果? 如果你理所当然地认为是3的话, 那么你就错了~~~ 实际结果应该是2.   为什么? 简而言之, x在内存的值并不是精确的1.3, 实际上可能是1.29999999...... 因为在计算机组成原因中有说过, 浮点数无法被准确地表示出来, 只能是一个非常精确的值.. 就算现在你已经知