菜单

运算出现Bug的方法澳门太阳集团

2020年3月18日 - 新闻中心

问题:

缓慢解决JS浮点数(小数卡塔尔国 运算现身Bug的办法
例如37.2 * 5.5 = 206.08 就直接用JS算了一个结实为: 204.60000000000002
怎会这么, 八个只有一人小数的数字相乘, 怎么大概多出那般小数点出来。
后来查了下,发掘原本那是JavaScript浮点运算的三个bug。

37.5*运算出现Bug的方法澳门太阳集团。5.5=206.08 (JS算出来是这么的四个结果,小编四舍五入取两位小数State of Qatar

方法 / 步骤
比如: 7 * 0.8 JavaScript算出来正是: 5.6000000000000005
网络找到了一部分消弭办法,
就是重新写了一些浮点运算的函数或直接扩充倍数运算。
上面就把这几个方法摘录下来, 以供境遇相似标题的心上人衔谋:
在你要用之处含有那一个函数, 然后调用它来测算就能够了。 /
假若在驾驭小数位个数的前提下,
可以思忖通过将浮点数放大倍数到整型(最终再除以相应倍数卡塔尔国,
再开展览演出算操作, 那样就能够得到正确的结果了

自己先疑惑是四舍五入的标题,就一贯用JS算了三个结出为:206.08499999999998

<!DOCTYPE html>
<html>

<head>
    <title>浮点数运算</title>
    <meta charset="utf-8">
    <meta http-equiv="Pragma" content="no-cache">
    <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=0" />
</head>
<body>
<script>
/* 解决JS浮点数(小数) 运算出现Bug的方法
37.2 * 5.5 = 206.08 就直接用JS算了一个结果为: 204.60000000000002 怎么会这样, 两个只有一位小数的数字相乘, 怎么可能多出这么小数点出来。 后来查了下,发现原来这是JavaScript浮点运算的一个bug。

方法 / 步骤
比如: 7 * 0.8 JavaScript算出来就是: 5.6000000000000005 网上找到了一些解决办法, 就是重新写了一些浮点运算的函数或直接扩大倍数运算。 下面就把这些方法摘录下来, 以供遇到同样问题的朋友参考:*/
/* 在你要用的地方包含这些函数, 然后调用它来计算就可以了。 / 如果在知道小数位个数的前提下, 可以考虑通过将浮点数放大倍数到整型(最后再除以相应倍数), 再进行运算操作, 这样就能得到正确的结果了*/
var jjxx={
    /*加法函数,返回值:arg1加上arg2的精确结果*/
    numAdd:function(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
    },
    /*减法函数, 返回值:arg1减去arg2的精确结果*/
    numSubtract:function(arg1, arg2) {
        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);
    },
    /*乘法函数 返回值:arg1乘以arg2的精确结果*/
    numMultiply:function(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)
    },
    /*除法函数, 返回值:arg1除以arg2的精确结果*/
    numDivide:function(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);
        }
    }
}
</script>
</body>
<script>
    alert(7 * 0.8)
    alert(jjxx.numMultiply(7,0.8))
</script>
</html>

怎会那样,四个独有一个人小数的数字相乘,怎么或然多出那样小数点出来。

 

作者Google了一晃,开采原先那是JavaScript浮点运算的叁个bug。

比如:7*0.8 JavaScript算出来正是:5.6000000000000005

解决措施:网络找到了一些消除办法,就是重复写了一些浮点运算的函数。

上边就把这些主意摘录下来,以供境遇相近题指标朋友仿照效法:

程序代码

//除法函数,用来得到精确的除法结果//说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。//调用:accDiv//返回值:arg1除以arg2的精确结果function accDiv{ var t1=0,t2=0,r1,r2; try{t1=arg1.toString[1].length}catch{} try{t2=arg2.toString[1].length}catch{ r1=Number.replace r2=Number.replace return ; }}//给Number类型增加一个div方法,调用起来更加方便。Number.prototype.div = function { return accDiv;}//乘法函数,用来得到精确的乘法结果//说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。//调用:accMul//返回值:arg1乘以arg2的精确结果function accMul{ var m=0,s1=arg1.toString; try{m+=s1.split[1].length}catch{} try{m+=s2.split[1].length}catch{} return Number*Number/Math.pow}//给Number类型增加一个mul方法,调用起来更加方便。Number.prototype.mul = function { return accMul;}//加法函数,用来得到精确的加法结果//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。//调用:accAdd//返回值:arg1加上arg2的精确结果function accAdd{ var r1,r2,m; try{r1=arg1.toString[1].length}catch{r1=0} try{r2=arg2.toString[1].length}catch{r2=0} m=Math.pow return /m}//给Number类型增加一个add方法,调用起来更加方便。Number.prototype.add = function { return accAdd;}

减法函数

function accSub {var r1, r2, m, n;try { r1 = arg1.toString[1].length } catch  { r1 = 0 }try { r2 = arg2.toString[1].length } catch  { r2 = 0 }m = Math.pow;//last modify by deeka//动态控制精度长度n =  ? r1 : r2;return  / m).toFixed;}

在你要用的地点含有那个函数,然后调用它来总括就足以了。

譬喻说你要计算:7*0.8 ,则改成

此外运算雷同,就足以得到相比标准的结果。

如上那篇js中Number数字数值运算后值不没有错解决措施正是笔者分享给我们的全体内容了,希望能给大家一个参阅,也指望我们多多点拨脚本之家。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图