javascript關於toFixed的計算規則

MangoGoing發表於2021-10-26

在標準瀏覽器裡,用這個方法得到的值看上去很像四捨五入。

但是其實它並不是一般數學意義上的四捨五入,我們可以找到反例,如下:

img

上圖前三個例子第三位小數是都是5,正常情況下應該進1,但是這裡卻都被捨去了,第四個也是5,但是結果是5捨去後前一位數字加1。是不是感覺有點混亂 ( ̄ェ ̄;)?

網上很多人說這個方法是銀行家四捨五入,所謂銀行家舍入法,其實質是一種四捨六入五取偶法(又稱四捨六入五留雙)。

具體規則是:四捨六入五考慮,五後非零就進一,五後為零看奇偶,五前為偶應捨去,五前為奇要進一。

按照這種規則,

10.1250.toFixed(2) 得到的值應該是10.12 (五前為偶應捨去)

10.3150.toFixed(2) 得到的值應該是10.32 (五前為奇要進一)

但是實際上呢,試一下,得到的結果如下

img

所以,它也不是銀行家舍入。

它的計算規則,我查了一下,大概是這樣:

<u>指定的小數位數的後一個數字非5時就四捨六入。如果是5的情況下,先得到一個舍5後保留前面數字的值A,和一個舍5後前面數字進1的值B,分別用著兩個值減去原數字,比較這兩個差值的絕對值,取絕對值較小的差值對應的A或者B,作為返回值。如果差值的絕對值一樣,就返回舍5後前面數字進1的值,也就是返回B。</u>這麼說可能不好理解,案例如下:

10.215.toFixed(2),指定了保留兩位小數,指定位數後面一個數字是5,執行以上規則

先得到兩個值 A=10.21 B=10.22

A-10.215=-0.004999999999999005

B-10.215=0.005000000000000782

第一個差值絕對值較小 ,所以最後返回的是A 10.21

10.515.toFixed(2) A=10.51 B=10.52

A-10.515=-0.005000000000000782

B-10.515=0.004999999999999005

第二個差值絕對值較小 ,所以最後返回的是B 10.52

10.125.toFixed(2) A=10.12 B=10.13

A-10.125=-0.005000000000000782

B-10.125=0.005000000000000782

兩個差值絕對值相等, 所以最後返回的是B 10.13

以上是toFixed方法在標準瀏覽器中的計算規則。

如果是在IE瀏覽器中,toFixed方法又變成了真正的四捨五入(僅在IE11中模擬了一下其他版本IE,請以實際表現為準)。

img

總結:用js原生的toFixed()來進行四捨五入,你很可能得到一個錯誤的結果。

其他可用的四捨五入方法 :

Math.round(xx.xxx*100)/100

相關文章