狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網站管理員

[轉帖]JS中計算出現(xiàn)無限小數(shù)位問題

liguoquan
2023年8月12日 10:15 本文熱度 572
:JS中計算出現(xiàn)無限小數(shù)位問題


JS中計算出現(xiàn)無限小數(shù)位問題,浮點數(shù)計算精度的問題,四則運算封裝

一、原因分析

在工作中遇到了關于金額的計算,用浮點數(shù)乘以100結果產生了一堆小數(shù)位。之前看過類似的文章,卻沒有記錄下來,總的來說原因就是由于計算機計算會先把數(shù)字轉換成二進制計算,然后在轉換為10進制,導致精度丟失。今天記錄一下,以備不時之需。

二、方法封裝

  1. 加法

    function add (num1, num2) {
    	if (parseFloat(num1).toString() == "NaN" || parseFloat(num2).toString() == "NaN") return false;
    	var r1 = 0, r2 = 0;
    	try {
      		r1 = num1.toString().split(".")[1].length;
    	} catch (e) {
    	}
    	try {
      		r2 = num2.toString().split(".")[1].length;
    	} catch (e) {
    	}
    	var n = Math.pow(10, Math.max(r1, r2));
    	return (num1 * n + num2 * n) / n;}// 測試一下addition(306994.91, 306994.91);// 控制臺輸出:613989.82

    方法中主要的部分是乘數(shù)和最后return的算法,如果不用封裝的話,可以自己寫一個比較大的數(shù)字,比如100000000,先把兩個加數(shù)分別乘以這個數(shù),這樣也可以計算正確,除非你知道你的數(shù)字范圍,否則不建議這樣做。

  2. 減法

    function sub(num1, num2) {  
    	if (parseFloat(num1).toString() == "NaN" || parseFloat(num2).toString() == "NaN") return;
    	var r1 = 0, r2 = 0;
    	try {
      		r1 = num1.toString().split(".")[1].length;
    	} catch (e) {
    	}
    	try {
      		r2 = num2.toString().split(".")[1].length;
    	} catch (e) {
    	}
    	var m = Math.pow(10, Math.max(r1, r2));
      		return (num1 * m - num2 * m) / m;}

    減法運算的原理和加法一樣,都是先乘以較大的數(shù)字,不多介紹!

  3. 乘法

    function mul(num1, num2) { 
    	if (parseFloat(num1).toString() == "NaN" || parseFloat(num2).toString() == "NaN") return; 
    	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);}

    乘法的計算主要是將數(shù)字轉換為整數(shù)相乘再除以10的N次冪

  4. 除法

    function div(arg1, arg2) {
    	if (parseFloat(num1).toString() == "NaN" || parseFloat(num2).toString() == "NaN") return;
    	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) {
    	}
    	r1 = Number(arg1.toString().replace(".", ""));
    	r2 = Number(arg2.toString().replace(".", ""));
    	return (r1 / r2) * Math.pow(10, t2 - t1);}

    主要是先轉整型進行計算再除以10的N次冪


該文章在 2023/8/12 10:15:09 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業(yè)務管理,結合碼頭的業(yè)務特點,圍繞調度、堆場作業(yè)而開發(fā)的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統(tǒng),標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved