欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

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

[轉(zhuǎn)帖]JS中計(jì)算出現(xiàn)無(wú)限小數(shù)位問(wèn)題

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


JS中計(jì)算出現(xiàn)無(wú)限小數(shù)位問(wèn)題,浮點(diǎn)數(shù)計(jì)算精度的問(wèn)題,四則運(yùn)算封裝

一、原因分析

在工作中遇到了關(guān)于金額的計(jì)算,用浮點(diǎn)數(shù)乘以100結(jié)果產(chǎn)生了一堆小數(shù)位。之前看過(guò)類(lèi)似的文章,卻沒(méi)有記錄下來(lái),總的來(lái)說(shuō)原因就是由于計(jì)算機(jī)計(jì)算會(huì)先把數(shù)字轉(zhuǎn)換成二進(jìn)制計(jì)算,然后在轉(zhuǎn)換為10進(jìn)制,導(dǎo)致精度丟失。今天記錄一下,以備不時(shí)之需。

二、方法封裝

  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;}// 測(cè)試一下addition(306994.91, 306994.91);// 控制臺(tái)輸出:613989.82

    方法中主要的部分是乘數(shù)和最后return的算法,如果不用封裝的話(huà),可以自己寫(xiě)一個(gè)比較大的數(shù)字,比如100000000,先把兩個(gè)加數(shù)分別乘以這個(gè)數(shù),這樣也可以計(jì)算正確,除非你知道你的數(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;}

    減法運(yùn)算的原理和加法一樣,都是先乘以較大的數(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);}

    乘法的計(jì)算主要是將數(shù)字轉(zhuǎn)換為整數(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);}

    主要是先轉(zhuǎn)整型進(jìn)行計(jì)算再除以10的N次冪


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