zoukankan      html  css  js  c++  java
  • 如何解决2进制小数不精确的问题

    如何解决2进制小数不精确的问题

    一、总结

    一句话总结:

    我们可以把需要进行计算的小数转成整数进行计算,然后在变成小数

    二、解决js中浮点数(小数)计算不准确问题

    转自或参考:解决js中浮点数(小数)计算不准确问题_技术之路-CSDN博客
    https://blog.csdn.net/qq_39712029/article/details/81031458

    1. 原因

    js计算最终也是通过计算机进行计算,而计算机只能识别二进制的0和1,也就是说我们所写的计算都必须转成二进制数才能进行计算,然而有些小数转成二进制数的时候除不尽,出现无限小数位,这时候就只能取近似值进行计算,导致了我们所遇到的不准确的问题。

    2. 解决方案

    解决思路: 我们可以把需要进行计算的小数转成整数进行计算,然后在变成小数

    可以像我这样写一个工具方法:

    //四则运算化成整数计算方法
        var floatCalc = function (a, b) {
            a = a + '', b = b + '';
            var aNum = a.indexOf('.'),
                bNum = b.indexOf('.'),
                aSum,
                bSum,
                resultNum,
                inta,
                intb;
    
            aSum = aNum < 0 ? 0 : a.split('.')[1].length;
            bSum = bNum < 0 ? 0 : b.split('.')[1].length;
            resultNum = aSum > bSum ? aSum : bSum;
    
            inta = aNum < 0 ? Number(a + (Math.pow(10, resultNum) + '').replace('1', '')) : (function () {
                a = a.replace('.', '');
                a = resultNum == aSum ? a : a + (Math.pow(10, resultNum - aSum) + '').replace('1', '');
                return Number(a);
            }())
    
            intb = bNum < 0 ? Number(b + (Math.pow(10, resultNum) + '').replace('1', '')) : (function () {
                b = b.replace('.', '');
                b = resultNum == bSum ? b : b + (Math.pow(10, resultNum - bSum) + '').replace('1', '');
                return Number(b);
            }())
    
            return {
                a: inta,
                b: intb,
                num: resultNum
            };
        }
        //加法
        Number.prototype.add = function (n) {
            var o = floatCalc(this, n);
            return (o.a + o.b) / Math.pow(10, o.num);
        }
        //减法
        Number.prototype.minus = function (n) {
            var o = floatCalc(this, n);
            return (o.a - o.b) / Math.pow(10, o.num);
        }
        //乘法
        Number.prototype.subtract = function (n) {
            var o = floatCalc(this, n);
            return (o.a * o.b) / Math.pow(10, o.num * 2);
        }
        //除法
        Number.prototype.divide = function (n) {
            var o = floatCalc(this, n);
            return (o.a / o.b);
        }

    这样就可以直接使用Number原型上的这些方法进行计算了

    console.log(686.40.add(62.41));
    console.log(1.22.minus(1));
    console.log(10.40.subtract(6));
    console.log(1..divide(1.22));

    注意:Number类型的整数直接调用原型上的方法会报错,引擎不能区分是小数点还是调用方法的点,这时候多写一个点或者加空格都可以(一般业务场景都是变量进行调用)

  • 相关阅读:
    python 垃圾回收装置
    文件夹同步/备份软件推荐 (SyncToy/FreeFileSync/Compare Advance/GoodSync/Allway Sync/Compare Advance)
    WCF的ABC
    NPOI导出多表头Execl(通过html表格遍历表头)
    分布式应用处理方式
    再探ASP.NET 5(转载)
    应聘.net开发工程师常见的面试题(五)
    应聘.net开发工程师常见的面试题(四)
    应聘.net开发工程师常见的面试题(二)(转载)
    应聘.net开发工程师常见的面试题(一)(转载)
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/12324666.html
Copyright © 2011-2022 走看看