zoukankan      html  css  js  c++  java
  • 解决JavaScript浮点数(小数) 运算出现Bug的方法

    解决JS浮点数(小数) 运算出现Bug的方法
    例如37.2 * 5.5 = 206.08 就直接用JS算了一个结果为: 204.60000000000002 怎么会这样, 两个只有一位小数的数字相乘, 怎么可能多出这么小数点出来。 后来查了下,发现原来这是JavaScript浮点运算的一个bug。

    方法 / 步骤
    比如: 7 * 0.8 JavaScript算出来就是: 5.6000000000000005 网上找到了一些解决办法, 就是重新写了一些浮点运算的函数或直接扩大倍数运算。 下面就把这些方法摘录下来, 以供遇到同样问题的朋友参考:
    在你要用的地方包含这些函数, 然后调用它来计算就可以了。 / 如果在知道小数位个数的前提下, 可以考虑通过将浮点数放大倍数到整型(最后再除以相应倍数), 再进行运算操作, 这样就能得到正确的结果了

    <!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>
  • 相关阅读:
    Node.js github开源代码
    Node.js Base64 Encoding和Decoding
    图论500题
    gvim中的gvimrc和vimrc
    ubuntu 命令行卸载并清理软件
    vim复制到系统剪贴板
    Electron 主进程与渲染进程之间的通 信(同步通信、异步通信)
    Android 使用系统录制视频功能
    Electron 自定义软件顶部菜单、右键菜单以及绑定快捷键
    Electron remote 模块、通过 BrowserWindow 打开新窗口
  • 原文地址:https://www.cnblogs.com/wangmaoling/p/8039951.html
Copyright © 2011-2022 走看看