JavaScript中解決計算精度丟失的問題

来源:https://www.cnblogs.com/hhmm99/archive/2018/08/26/9536920.html
-Advertisement-
Play Games

在做項目之前老師就給我們封裝好了一個js文件,解決計算中丟失精度的一些函數,直接引用js文件就可以使用。 eg: var numA = 0.1; var numB = 0.2; alert( numA + numB ); 出現結果:0.1 + 0.2 = 0.30000000000000004 為什 ...


在做項目之前老師就給我們封裝好了一個js文件,解決計算中丟失精度的一些函數,直接引用js文件就可以使用。

eg:

var numA = 0.1; 
var numB = 0.2; 
alert( numA + numB );

出現結果:0.1 + 0.2 = 0.30000000000000004 

為什麼出現這個問題:電腦讀懂的是二進位,而不是十進位,就是程式在進位轉換時候丟失了精度。

解決問題代碼:

    //除法函數,用來得到精確的除法結果
    //說明:javascript的除法結果會有誤差,在兩個浮點數相除的時候會比較明顯。這個函數返回較為精確的除法結果。
    //調用:accDiv(arg1,arg2)
    //返回值:arg1除以arg2的精確結果
    function accDiv(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);
        }
    }
    //乘法函數,用來得到精確的乘法結果
    //說明:javascript的乘法結果會有誤差,在兩個浮點數相乘的時候會比較明顯。這個函數返回較為精確的乘法結果。
    //調用:accMul(arg1,arg2)
    //返回值:arg1乘以arg2的精確結果
    function accMul(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);
    }
    //加法函數,用來得到精確的加法結果
    //說明:javascript的加法結果會有誤差,在兩個浮點數相加的時候會比較明顯。這個函數返回較為精確的加法結果。
    //調用:accAdd(arg1,arg2)
    //返回值:arg1加上arg2的精確結果
    function accAdd(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;
    }
    //減法函數
    function accSub(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));
        //last modify by deeka
        //動態控制精度長度
        n = (r1 >= r2) ? r1 : r2;
        return ((arg2 * m - arg1 * m) / m).toFixed(n);
    }
    
    
    //給Number類型增加一個add方法,調用起來更加方便。
    Number.prototype.add = function (arg) {
        return accAdd(arg, this);
    };
    //給Number類增加一個sub方法,調用起來更加方便
    Number.prototype.sub = function (arg) {
        return accSub(arg, this);
    };
    //給Number類型增加一個mul方法
    Number.prototype.mul = function (arg) {
        return accMul(arg, this);
    };
    //給Number類型擴展一個div方法
    Number.prototype.div = function (arg) {
        return accDiv(this, arg);
    };

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • npm全稱Node Package Manager,是node.js的模塊依賴管理工具。由於npm的源在國外,所以國內用戶使用起來各種不方便。我們通過設置使用[淘寶](https://npm.taobao.org/)的鏡像來加快我們的速度。### 臨時使用```npm --registry http... ...
  • 1、數據類型:原始類型(primitive type) 和對象類型(object type) 原始類型包括數字、字元串和布爾值; 除數字、字元串、布爾值、null(空)、undefined(未定義),其它都屬於對象類型。 也可以分為可變(mutable)類型和不可變(immutable)類型。數字、 ...
  • 1、數組初始化表達式 數組直接量中的列表逗號之間的元素可以省略,這時省略的空位會填充undefined。如: 2 2 1 var arr = [1,,,,,6]; 2 console.log(arr[2]); //列印數組中索引為2的值->undefined 2 2 1 var arr = [1,, ...
  • 1、pm2簡介 pm2(process manager)是一個進程管理工具,維護一個進程列表,可以用它來管理你的node進程,負責所有正在運行的進程,並查看node進程的狀態,也支持性能監控,負載均衡等功能。 1.1、使用pm2管理的node程式的好處 監聽文件變化,自動重啟程式 支持性能監控 負載 ...
  • 面試題:function fn(a,b){ console.log(this); console.log(a); console.log(a+b);}fn.call(1);fn.call.call(fn);fn.call.call.call(fn,1,2);fn.call.call.call.cal ...
  • Js初體驗(-) 1 js的基礎知識 A web三大標準:1 html:結構標準 2 css:表現標準 3 javascript:行為標準 B js三種書寫方式:1 行內js:onclick = “alert=(‘AAAAA’)” 2 內嵌js:在html頁面中通過一對script標簽,js代碼寫在 ...
  • 居中在前端佈局上很常見,也很常用,也是最基本的技巧。居中效果在方向控制上基本可以分解成水平居中,垂直居中和水平垂直居中。 針對調整的元素不同,具體的處理方式上有些差異。這裡我們先不講絕對定位下的居中,絕對定位下的居中方法很多,變化也多。下麵講的都是非絕對定位下的方法,原則上有兩個,一個是常用,另外一 ...
  • vue-picture-preview-extend vue-picture-preview的擴展版本,本文中插件是由其他大神開發,我做了一些擴展,原文鏈接:https://segmentfault.com/u/x_logic。 預覽(原文章的預覽,非擴展後的) 安裝 使用 首先在項目的入口文件中引 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...