很多朋友想了解關於保留有效數字的規則的一些資料信息,下麵是(揚升資訊www.balincan8.com)小編整理的與保留有效數字的規則相關的內容分享給大家,一起來看看吧。
最近做的項目涉及到金額的計算,需要進行小數位處理,由於白碼平台默認就是保留兩位小數,所以沒怎麽注意,直到客戶反饋了金額計算的bug我才如夢初醒(虧了一毛錢!),原來現在主流的金額取舍規則流行的是歐洲那套“四舍六入五成雙”的規則(也叫銀行家算法),而平台上使用的是四舍五入!於是我改用編程來計算金額,使用toFixed()方法來取舍。
小知識:
toFixed它是一個四舍六入五成雙的詭異的方法(也叫銀行家算法),"四舍六入五成雙"含義:對於位數很多的近似數,當有效位數確定後,其後麵多餘的數字應該舍去,隻保留有效數字最末一位,這種修約(舍入)規則是“四舍六入五成雙”,也即“4舍6入5湊偶”這裏“四”是指≤4 時舍去,"六"是指≥6時進上,"五"指的是根據5後麵的數字來定,當5後有數時,舍5入1;當5後無有效數字時,需要分兩種情況來講:①5前為奇數,舍5入1;②5前為偶數,舍5不進。(0是偶數)。
本以為萬事大吉了,可是呢,客戶又虧錢了!仔細深究了下toFixed這個方法,好家夥,這個方法在穀歌瀏覽器上並沒有完全遵守四舍六入五成雙的規則,尤其是5後麵沒有數字的情況:

由此可見,涉及金額計算的時候,不要使用這個方法,否則出大問題,下麵我找了個別人寫的方法,可以完全遵循四舍六入五成雙的規則:
functionevenRound(num,decimalPlaces){/***修約規則:四舍六入五成雙*num:要取舍的數字*decimalPlaces:保留位數*由於輸出數字,不足位數部分不補0*/letd=decimalPlaces||0;letm=Math.pow(10,d);letn=+(d?num*m:num).toFixed(8);leti=Math.floor(n),f=n-i;lete=1e-8;letr=(f0.5-e&&f0.5+e)?((i%2==0)?i:i+1):Math.round(n);returnd?r/m:r;}效果:
因為轉出來的是數字,如果本身小數位不足的情況不會補0;這裏隻要再將轉出來的數字使用toFixed(),轉一遍就可以了。

最後,由於白碼低代碼開發平台的數字類型默認保存的是兩位小數,超出部分會根據四舍五入規則取舍,如果有需要保留更多位小數的,需要聯係客服申請了。
本文到此結束,希望對大家有所幫助呢。