js浮点运算的问题

问题引入:今天在前台js处理两个数字的相乘时出现了精度的偏差:1.2*3=3.9999999995,本来应该是3.6的。百度了一下,发现这是js浮点运算的一个Bug。网上找了一些对js浮点数运算的重写方法,现在把这些方法总结一下,以供遇到同样问题的朋友参考。

程序代码

1、除法函数

//调用:accDiv(arg1,arg2)
//返回值:arg1除以arg2的精确结果
function accDiv(arg1,arg2){
    var t1=0,t2=0,r1,r2;
    try{t1=arg1.toString().split(".")[1].length}catch(e){}
    try{t2=arg2.toString().split(".")[1].length}catch(e){}
    with(Math){
        r1=Number(arg1.toString().replace(".",""))
        r2=Number(arg2.toString().replace(".",""))
        return (r1/r2)*pow(10,t2-t1);
    }
}

也可以扩张Number方法,直接调用

Number.prototype.div = function (arg){
    return accDiv(this, arg);
}

2、乘法函数

//调用:accMul(arg1,arg2)
//返回值:arg1乘以arg2的精确结果
function accMul(arg1,arg2)
{
    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方法,直接调用

Number.prototype.mul = function (arg){
    return accMul(arg, this);
}

3、加法函数

//调用:accAdd(arg1,arg2)
//返回值:arg1加上arg2的精确结果
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
}

也可以扩张Number方法,直接调用

Number.prototype.add = function (arg){
    return accAdd(arg,this);
}

希望对大家有帮助

时间: 2024-10-31 04:51:19

js浮点运算的问题的相关文章

js 浮点运算bug

js几个浮点运算的bug,比如6.9-1.1,7*0.8,2.1/0.3,2.2+2.1 实现思路 通过将浮点数放大倍数到整型(最后再除以相应倍数),再进行运算操作,这样就能得到正确的结果了 比如:11*(22.9*10)/10 1 <script> 2 //除法函数,用来得到精确的除法结果 3 //说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显.这个函数返回较为精确的除法结果. 4 //调用:2.1.div(0.3) 等于2.1 / 0.3 5 //返回值:t

关于js小数计算的问题

在js浮点运算中 var a=0.2-0.1; var b=0.3-0.2; console.log(a==b); 答案是什么呢,很多人可能认为是true,包括我在内,但是当我写出来运行了一下,我被答案惊呆了,上图 小伙伴们,惊呆了有木有! 然后我赶紧问度娘,然后终于找到了答案,原来js运算的时候是要转成二进制的,这样的话浮点就会有误差,0.3-0.2就是0.09999999999999998,非常近似0.1,所以a最终不等于b

HTML5移动开发之路(28)—— JavaScript回顾3

本文为 兄弟连IT教育 机构官方 HTML5培训 教程,主要介绍:HTML5移动开发之路(28)-- JavaScript回顾3 一.基本数据类型 number:数字类型 string:字符串 (注意s小写:string是基本类型) boolean:布尔类型   //前三个都有对应的包装类 null:空类型 undefined:未定义类型 测试一: [html] view plain copy print? <html> <!--基本类型测试--> <head> <

javascript精确计算

一篇文章: 4 个用于执行高级数学计算的 JavaScript 库 numbers.js  Numeric Javascript accounting.js Tangle 有时只需要加减乘法能精确,没必要用到库.首先看下js浮点运算问题. JS里做小数的乘法运算时会出现浮点错误,具体可以测试一下: <script> alert(11*22.9)</script> 结果是251.89999999999998 而不是251.9 这个问 题想必有很多人为之头痛.那么如何解决呢?在此给出解

对js的一些总结

---------最近工作老是在做前端页面,不可避免的使用了js.下面针对工作中使用到的js进行整理总结.  类型 总所周知,js是个弱类型语言,可以使用var声明一切类型变量:js和其他的语言具有的数据类型差不多,除了Number数值类型需要注意.在对变量进行具体的赋值后:变量会与值的类型同步:而通过DOM操作获取的值类型往往是字符串类型,所以类型转换一般为字符串转其他.记录一下js常用的类型转化方法. string 转换为其他类型 方法:parseInt() .parseFloat() .N

Node.js的线程和进程

http://www.admin10000.com/document/4196.html 前言 很多Node.js初学者都会有这样的疑惑,Node.js到底是单线程的还是多线程的?通过本章的学习,能够让读者较为清晰的理解Node.js对于单/多线程的关系和支持情况.同时本章还将列举一些让Node.js的web服务器线程阻塞的例子,最后会提供Node.js碰到这类cpu密集型问题的解决方案. 在学习本章之前,读者需要对Node.js有一个初步的认识,熟悉Node.js基本语法.cluster模块.

js中的浮点数运算精度问题

js中的浮点数精度一般可以达到16位有效数字,因此有人使用parseFloat(x.toFixed(12))来提高js中浮点运算的精度. 经验证,这种方法当整数位数较少时基本正确,但对于较大或较小的运算结果是无效的,如1222.31*2344,直接运算结果是2865094.6399999997,parseFloat((1222.31*2344).toFixed(12))后仍然是2865094.6399999997,并未提升精度. 此时,应该先将结果归一化后再进行toFixed(12)这样的处理,

JS学习笔记(三) 对象

参考资料: 1. http://www.w3school.com.cn/js/js_objects.asp ? 知识点: ? Javascript中的所有事物都是对象. ? Javascript是基于prototype,而不是基于类的. ? Javascript是面向对象的语言,但Javascript不使用类.因此,在Javascript中,不会创建类,也不会通过类来创建对象. ? Javascript中的所有数字都存储为根为10的64位的浮点数.其中,整数最多为15位,小数最大位数为17,且浮

JS浮点数运算Bug的解决办法【转】

37.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数) 我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.08499999999998 怎么会这样,两个只有一位小数的数字相乘,怎么可能多出这么小数点出来. 我Google了一下,发现原来这是JavaScript浮点运算的一个bug. 比如:7*0.8 JavaScript算出来就是:5.6000000000000005 网上找到了一些解决办法,就是重新写了一些浮点运算的函数或直接扩大倍数运算. 下面就把这