zoukankan      html  css  js  c++  java
  • JS

    前言

    js浮点数的计算存在精度不准的问题,解决方案:用整数与整数的加减乘除运算来规避该问题


    JS - 浮点数计算不精确

    let [num1,num2] = [0.1, 0.2];
    
    console.log(num1 + num2); // 0.30000000000000004
    console.log(num1 - num2); // -0.1
    console.log(num1 * num2); // 0.020000000000000004
    console.log(num1 / num2); // 0.5
    

    解决方案

    • number.js
    /**
     * 加 +
     * @param num1
     * @param num2
     * @returns {number}
     */
    function accAddition(num1, num2) {
        const num1Digits = (num1.toString().split('.')[1] || '').length;
        const num2Digits = (num2.toString().split('.')[1] || '').length;
        const baseNum = Math.pow(10, Math.max(num1Digits, num2Digits));
        return (Math.round(num1 * baseNum) + Math.round(num2 * baseNum)) / baseNum;
    }
    
    /**
     * 减 -
     * @param num1
     * @param num2
     * @returns {number}
     */
    function accSubtract(num1, num2) {
        const num1Digits = (num1.toString().split('.')[1] || '').length;
        const num2Digits = (num2.toString().split('.')[1] || '').length;
        const baseNum = Math.pow(10, Math.max(num1Digits, num2Digits));
        return (Math.round(num1 * baseNum) - Math.round(num2 * baseNum)) / baseNum;
    }
    
    /**
     * 乘 *
     * @param num1
     * @param num2
     * @returns {number}
     */
    function accMultiply(num1, num2) {
        const num1Digits = (num1.toString().split('.')[1] || '').length;
        const num2Digits = (num2.toString().split('.')[1] || '').length;
        const baseNum = Math.pow(10, Math.max(num1Digits, num2Digits));
        return (Math.round(num1 * baseNum) * Math.round(num2 * baseNum)) / baseNum / baseNum;
    }
    
    /**
     * 除 /
     * @param num1
     * @param num2
     * @returns {number}
     */
    function accDivision(num1, num2) {
        const num1Digits = (num1.toString().split('.')[1] || '').length;
        const num2Digits = (num2.toString().split('.')[1] || '').length;
        const baseNum = Math.pow(10, Math.max(num1Digits, num2Digits));
        return (Math.round(num1 * baseNum) / Math.round(num2 * baseNum));
    }
    
    export {
        accAddition,
        accMultiply,
        accSubtract,
        accDivision
    }
    

    结果验证

    import {accAddition, accSubtract, accMultiply, accDivision} from "@/utils/number";
    
    let [num1,num2] = [0.1, 0.2];
    
    console.log(accAddition(num1, num2)); // 0.3
    console.log(accSubtract(num1, num2)); // -0.1
    console.log(accMultiply(num1, num2)); // 0.02
    console.log(accDivision(num1, num2)); // 0.5
    

    - End -
    梦想是咸鱼
    关注一下吧
    以上为本篇文章的主要内容,希望大家多提意见,如果喜欢记得点个推荐哦
    作者:Maggieq8324
    本文版权归作者和博客园共有,欢迎转载,转载时保留原作者和文章地址即可。
  • 相关阅读:
    使用图形化界面打包自己的类库
    搭建自己的NuGet服务器,上传自定义NuGet包
    在内部架设NuGet服务器
    Prism简介
    Nhibernate Icreteria 分页查询
    uDig介绍
    基于Geoserver配置多图层地图以及利用uDig来进行样式配置
    如何在GeoServer上发布一张地图
    XML的SelectNodes使用方法以及XPath
    coded ui run in interactive mode
  • 原文地址:https://www.cnblogs.com/maggieq8324/p/15211821.html
Copyright © 2011-2022 走看看