js浮点数乘除法

JS在处理浮点数计算时经常会遇到精度的问题,上一篇博客封装了JS浮点数加减法的方法,这一次来封装一下js浮点数乘除法运算。



其实浮点除法的封装跟加减法的封装原理是一样,只是在第一次计算完后会再复位小数位数的时候稍微会复杂一点。

加法运算在第一次清除小数点计算后,根据小数位数的最大值可以知道计算后的结果应该再复位多少位小数。

而乘除法运算得分二种情况:

乘法运算时,二个数去掉小数点,相当于放大了10的对应二数小数点位数的和的次幂,所以计算完后的结果应该保留至少对应小数位数的和的位数;

除法运算时,二个数去掉小数点,相当于乘上了10的(被除数的小数位数-除数的小们数)次幂,如果被除数的小数位数-除数的小们数大于0则是小数增加对应位,如果是小于0则小数位数减少或放大对应10的倍数



代码如下

//浮点数乘除法
    function muldivfloat(num0,num1,bzstr){
        var ln0=getws(num0),//第一个值的的小数位数
            ln1=getws(num1),//第二个值的的小数位数
            lnz=Math.max(ln0,ln1),//取得小数位数中的最大数
            lncz,//小数位数的统计值
            num0str,//第一个值数字转字符
            num1str,//第二个值数字转字符
            resultz,//计算结果
            lnqh;//除法后结果存储小数

        if(lnz===0){//如果数字原本就是整形,直接执行计算
            if(bzstr==="*"){
                resultz=Number(num0)*Number(num1);
            }else{
                resultz=Number(num0)/Number(num1);
            }
            return resultz;
        }

        num0str=clearpoint(num0,".");
        num1str=clearpoint(num1,".");
        //根据传入的符号来判断是做乘法还是除法运算
        if(bzstr==="*"){
            lncz=ln0+ln1;//小数位数的总数
            resultz=addwsfront((Number(num0str)*Number(num1str)).toString(),lncz);//对乘法运算后的结果执行位数补全
            return Number(resultz.slice(0,-lncz)+"."+resultz.slice(-lncz));
        } else {
            lncz=ln0-ln1;//小数位数的差数
            resultz=Number(num0str)/Number(num1str);
            if(lncz===0){//如果除数,被除除数小数位相同,即直接返回计算值
                return resultz;
            }
            lnqh=getws(resultz);//除法计算后可能的小数位数
            resultz=clearpoint(resultz,".");//除法运算结果去小数位数
            lncz=lncz+lnqh;//最后应该保留的小数位数
            if(lncz>0){//如果要保留的小数位数不够
                resultz=addwsfront(resultz,lncz);//对计算的结果前补0
                return Number(resultz.slice(0,-lncz)+"."+resultz.slice(-lncz));
            }else {//如果要保留的小数位数小于0
                lncz=Math.abs(lncz);
                resultz=addwsback(resultz,lncz);//对计算的结果后补0
                console.log(lncz,resultz);
                return Number(resultz);
            }

        }

    }
    //后补0补够位数
    function addwsback(str,len){
        for(var i=0;i<len;i++){
            str=str+"0";
        }
        return str;
    }
    //前置0补够位数
    function addwsfront(str,len){
        var strlen=str.length,
            cz=len-strlen,
            returnstr="";
        if(cz<=0){
            returnstr=str;
        } else {
            for(var i=0;i<cz;i++){
                str="0"+str;
            }
            returnstr=str;
        }
        return returnstr;
    }
    //取得小数位数
    function getws(num){
        try {
            ln=num.toString().split(".")[1].length;//获取小数位数
        }catch(e){
            ln=0;
        }
        return ln;
    }
    //补全0
    function getbq(str,len){
        for(var i=0;i<len;i++){
            str=str+"0";
        }
        return str;
    }
    //浮点型数去小数点转字符串
    function clearpoint(num,str){
        return num.toString().replace(str,"");
    }

测试结果如下:

至少575659.82*100是没有精度的问题啦,呵呵。

在线测试地址

个人知识有限,如有不正确的地方,望指正,共同学习进步!

时间: 2024-10-24 05:37:58

js浮点数乘除法的相关文章

关于js浮点数计算精度不准确问题的解决办法

今天在计算商品价格的时候再次遇到js浮点数计算出现误差的问题,以前就一直碰到这个问题,都是简单的使用tofixed方法进行处理一下,这对于一个程序员来说是及其不严谨的.因此在网上收集了一些处理浮点数精度的文章.觉得别人写的挺好了,我在简单的总结一下,以方便后续查阅. 浮点数误差产生的原因: 先看一个实例: 0.1 + 0.2 =? 0.1 + 0.2 = 0.3? 我们先来看一段 JS. console.log( 0.1+ 0.2); 输出为 0.30000000000000004.是不是很奇葩

js浮点数计算问题 + 金额大写转换

一 js浮点数计算问题解决方案: 1.使用 NumberObject.toFixed(num) 方法 toFixed() 方法可把 Number 四舍五入为指定小数位数的数字. 2.较精度计算浮点数 //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显.这个函数返回较为精确的加法结果. //调用:accAdd(arg1,arg2) //返回值:arg1加上arg2的精确结果 function accAdd(arg1, arg2) { var r1, r2, m; t

js浮点数相加、减、乘、除精确计算

js 浮点数计算时 ,无缘无辜 后边冒出一堆 小数点………… 貌似js本身的问题,类型不定?????? 只能自己写函数处理..  http://blog.csdn.net/w4bobo/article/details/9143663 借鉴一下 1 //调用:accAdd(arg1,arg2) 2 //返回值:arg1加上arg2的精确结果 3 function accAdd(arg1,arg2){ 4 var r1,r2,m; 5 try{r1=arg1.toString().split(".&

js浮点数算术出现多为小数

/****************************************解决JS浮点数(小数)计算加减乘除的BUG Start****************************************/ 问题:js浮点数运算问题---莫名出现多位小数 // 原因:这是由于在运算的时候先把浮点数转化成二进制后进行运算,// 但是有的小数在二进制编码后出现无限循环,// 因而导致计算出现了误差,在其它变成语言中也有类似的问题. /**** 加法函数,用来得到精确的加法结果** 说明:

js中的除法

最近做了一个分页的用户控件,使用到了js中的除法.整理如下. Math.ceil();向上舍入,比如Math.ceil(3/2)=2; Math.floor();向下舍入,比如Math.floor(3/2)=1; Math.round();四舍五入,比如Math.round(3/2)=2;Math.round(5/2)=2; 同时也用到了ExtJs中对获取Store中的一些方法: App.Store1.pageSize;获取当前Store中的页面大小: App.Store1.currentPag

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

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

js浮点数的计算总结

在js浮点值的计算中,很多时候会出现不准确的情况,如下面的情况 console.log(2.2 + 2.1) // 4.300000000000001 console.log(2.2 - 1.9) // 0.30000000000000027 console.log(2.2 * 2.2) // 4.840000000000001 console.log(2.1 / 0.3) // 7.000000000000001 console.log(10 - 9.99) // 0.009999999999

JS浮点数的加减乘除运算

文章来源地址:http://blog.csdn.net/lyd518/article/details/7236464 转载请注明出处,尊重作者劳动成果,谢谢!问题这样的: 37.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数) 我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.08499999999998 怎么会这样,两个只有一位小数的数字相乘,怎么可能多出这么小数点出来. 我Google了一下,发现原来这是JavaScript浮点运算的一个bug. 比

JS 精确乘除法

javascript(js)的小数点乘法除法问题 分类: Javascript2012-07-24 10:09 2851人阅读 评论(0) 收藏 举报 javascriptfunctionmath测试div 一.用js计算 12.32 * 7  结果是多少? 答案:86.24000000000001 为什么会出现这种问题?怎么解决? js在处理小数的乘除法的时候有一个bug,解决的方法可以是:将小数变为整数来处理. 以上的计算可以改为: 12.32 * 100 * 7 /100 得出的结果是:8