浮点型数据运算精度bug

/**
         * 校验是否为数字
         * @param arg
         * @return
         */
        function checkIsNumber(arg){
            if(arg != null && arg.toString() != ""){
                var re = /^-?(0|[1-9]+\d*|[1-9]+\d*\.\d+|0\.\d+)$/;
                if(re.test(arg.toString())){
                    return true;
                }
            }
            return false;
        }

        /**
         * 加法函数,用来得到精确的加法结果
         * 说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
         * 返回值注意:arg1和arg2可能是整数、浮点数、null、空字符串、其他字符串
         * @param arg1
         * @param arg2
         * @return
         */
        function accAdd(arg1,arg2){
            if(!checkIsNumber(arg1) || !checkIsNumber(arg2)){
                return null;
            }
            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;
        }

        // 给Number类型增加一个add方法,调用起来更加方便。
        Number.prototype.add = function (arg){
            return accAdd(this,arg);
        }

        /**
         * 减法函数,用来得到精确的减法结果
         * 说明:javascript的减法结果会有误差,在两个浮点数相减的时候会比较明显。这个函数返回较为精确的减法结果。
         * 返回值:arg1-arg2的值,arg1和arg2可能是整数、浮点数、null、空字符串、其他字符串
         * @param arg1
         * @param arg2
         * @return
         */
        function accSub(arg1,arg2){
            if(!checkIsNumber(arg1) || !checkIsNumber(arg2)){
                return null;
            }
            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);
            return (arg1*m-arg2*m)/m;
        }

        // 给Number类型增加一个subduct方法,调用起来更加方便。
        Number.prototype.subduct = function (arg){
            return accSub(this,arg);
        }

        /**
         * 除法函数,用来得到精确的除法结果
         * 说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
         * 返回值:arg1除以arg2的精确结果
         * @param arg1
         * @param arg2
         * @return
         */
        function accDiv(arg1,arg2){
            if(!checkIsNumber(arg1) || !checkIsNumber(arg2)){
                return null;
            }
            var t1,t2,r1,r2;
            try{t1=arg1.toString().split(".")[1].length;}catch(e){t1=0;}
            try{t2=arg2.toString().split(".")[1].length;}catch(e){t2=0;}
            with(Math){
            r1=Number(arg1.toString().replace(".",""));
            r2=Number(arg2.toString().replace(".",""));
            return (r1/r2)*pow(10,t2-t1);
            }
        } 

        // 给Number类型增加一个div方法,调用起来更加方便。
        Number.prototype.div = function (arg){
            return accDiv(this,arg);
        } 

        /**
         * 乘法函数,用来得到精确的乘法结果
         * 说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
         * 返回值:arg1乘以arg2的精确结果
         * @param arg1
         * @param arg2
         * @return
         */
        function accMul(arg1,arg2) {
            if(!checkIsNumber(arg1) || !checkIsNumber(arg2)){
                return null;
            }
            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);
        } 

        // 给Number类型增加一个mul方法,调用起来更加方便。
        Number.prototype.mul = function (arg){
            return accMul(this,arg);
        } 

        console.log(accAdd(0.3,0.2)+" "+accSub(0.3,0.2))    
时间: 2024-10-01 05:28:12

浮点型数据运算精度bug的相关文章

对非正确使用浮点型数据而导致项目BUG的问题探讨

乘法分配律 在上小学的时候就已经学习过乘法分配律,乘法分配律的具体内容是:两个数的和与一个数相乘,可以先把他们分别与这个数相乘,再相加,得数不变.乘法分配律的定义还可以用表达式"(a+b)×c = a×c+b×c"的形式给出.乘法分配律的反用"a×c+b×c = (a+b)×c"同样成立.例如"10.2×(3+7) = 10.2×3+10.2×7 = 102"(反用形式为"10.2×3+10.2×7 = 10.2×(3+7) = 102

Java中浮点型数据Float和Double进行精确计算的问题

一.浮点计算中发生精度丢失  大概很多有编程经验的朋友都对这个问题不陌生了:无论你使用的是什么编程语言,在使用浮点型数据进行精确计算时,你都有可能遇到计算结果出错的情况.来看下面的例子. // 这是一个利用浮点型数据进行精确计算时结果出错的例子,使用Java编写,有所省略. double a = (1.2 - 0.4) / 0.1;System.out.println(a); 如果你认为这个程序的输出结果是“8”的话,那你就错了.实际上,程序的输出结果是“7.999999999999999”.好

python修行之路(三 模块初识及数据运算类型)

在python修行路上,果不其然的遇到了第一个困处,开始看不懂代码,开始出现理解苦难的现象,这是小白修行路上的正常现象.其实自己是很慌的,感觉很无助,能做的就是把自己学的慢慢记录下来,理一个自己的逻辑,尽量写清楚,写的通俗易懂,为与我类似的修行者做参考. 一.模块初识 Python的强大之处在于他有非常丰富和强大的标准库和第三方库,使用时安装调用就好,现在先象征性的学习2个简单的. sys模块--sys pass功能#!/usr/bin/env python# -*- coding: utf-8

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

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

浮点型数据

浮点型数据不能精确存储,5.21*100 ?=521.00 浮点型数据转整型数据,为了避免因丢失精度导致转换不准确,可加0.5. 显示浮点型字符串,应避免转换为浮点型数据.

python学习笔记2-变量、数据类型、数据运算

一.python的变量 变量,可变的量,主要用来存储数据:变量是一个存储位置和一个关联的符号名字,这个存储位置包含了一些已知或未知的量或者信息,即值. 1.变量的语法结构 name = "xiaoling" #这就是定义了一个变量,变量的名字为:name:变量的值为:xiaoling 2.变量的命名规范 变量只能是字母.数字或下划线的任意组合 变量的第一个字符不能是数字 以下关键字不能声明为变量 ['and', 'as', 'assert', 'break', 'class','con

DSP数据运算基础

转载自:http://bbs.21ic.com/icview-841266-1-1.html 在应用DSP时,其实硬件一般都问题不大,主要的是软件,是算法!下面的关于DSP运算的精华但愿有些价值! 一 DSP定点算数运算 1 数的定标 在定点DSP芯片中,采用定点数进行数值运算,其操作数一般采用整型数来表示.一个整型数的最大表示范围取决于DSP芯片所给定的字长,一般为16位或24位.显然,字长越长,所能表示的数的范围越大,精度也越高.如无特别说明,本书均以16位字长为例. DSP芯片的数以2的补

python基础8 数据类型和数据运算

本节内容: 数据类型 数据运算 入门拾遗 参考网页 数据类型 数字 int(整型) 在32位机器上,整数的位数为32位,取值范围为-231-231-1,即-2147483648-2147483647 在64位系统上,整数的位数为64位,取值范围为-263-263-1,即-9223372036854775808-9223372036854775807 long(长整型) 跟C语言不同,Python的长整数没有指定位宽,即:Python没有限制长整数数值的大小,但实际上由于机器内存有限,我们使用的长

python3基础3--数据类型--数据运算--表达式if -else-while-for

一.python3 数据类型 1.1 数字 例如:1,2,3,4等 1.2  int(整型) 在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,即-2147483648-2147483647在64位系统上,整数的位数为64位,取值范围为-2**63-2**63-1,即-9223372036854775808-9223372036854775807 1.2.1 long(长整型) 跟C语言不同,Python的长整数没有指定位宽,即:Python没有限制长整数数值的大小,但