最近一段時候公司的項目中遇到這么個事情,需要計算手續費,而這個手續費必須是保留小數點后面兩位,且是由小數點后面第三位四舍五入,就這么個場景:
說說我計算的過程,下面是前兩個數是測試用的:
howMuch = 119;
allow_sum = 116;
interest = 0.005;//這是利率
計算出來的是(119-116)*0.005 = 0.015,按照業務要求四舍五入保留小數點后2位,結果應該是0.02
1.一開始直接使用的toFixed方法計算的手續費:
計算方式:value = (((howMuch-allow_sum)*interest*100)/100).toFixed(2);
計算結果:0.01
原因:toFixed它是一個四舍六入五成雙的詭異的方法,"四舍六入五成雙"含義:對於位數很多的近似數,當有效位數確定后,其后面多余的數字應該舍去,只保留有效數字最末一位,這種修約(舍入)規則是“四舍六入五成雙”,也即“4舍6入5湊偶”這里“四”是指≤4 時舍去,"六"是指≥6時進上,"五"指的是根據5后面的數字來定,當5后有數時,舍5入1;當5后無有效數字時,需要分兩種情況來講:①5前為奇數,舍5入1;②5前為偶數,舍5不進。(0是偶數)
2.發現問題后我就換了一種方法[Math.round()],這種方法避免了上面的問題:
計算方式:value = Math.round((howMuch-allow_sum)*interest*100)/100;
計算結果:0.02
雖然避免了上面的問題,在特定的情況下有引發了新的問題,比如:
howMuch = 119;
allow_sum = 100;
計算方式:value = Math.round((howMuch-allow_sum)*interest*100)/100;
計算結果:計算出來的是(119-100)*0.005 = 0.095,四舍五入就變成了0.1了,而業務需求是小數點后面兩位,也就是0.10
3.發現上一個問題后,我決定把兩個方法結合起來使用:
計算方式:value = (Math.round((howMuch-allow_sum)*interest*100)/100).toFixed(2);
計算結果:計算出來的是(119-100)*0.005 = 0.095,四舍五入后是0.10,剛好符合業務的要求
寫的不對的地方,歡迎留言指正,謝謝!