在標準瀏覽器裡,用這個方法得到的值看上去很像四捨五入。
但是其實它並不是一般數學意義上的四捨五入,我們可以找到反例,如下:
上圖前三個例子第三位小數是都是5,正常情況下應該進1,但是這裡卻都被捨去了,第四個也是5,但是結果是5捨去後前一位數字加1。是不是感覺有點混亂 ( ̄ェ ̄;)?
網上很多人說這個方法是銀行家四捨五入,所謂銀行家舍入法,其實質是一種四捨六入五取偶法(又稱四捨六入五留雙)。
具體規則是:四捨六入五考慮,五後非零就進一,五後為零看奇偶,五前為偶應捨去,五前為奇要進一。
按照這種規則,
10.1250.toFixed(2)
得到的值應該是10.12
(五前為偶應捨去)
10.3150.toFixed(2)
得到的值應該是10.32
(五前為奇要進一)
但是實際上呢,試一下,得到的結果如下
所以,它也不是銀行家舍入。
它的計算規則,我查了一下,大概是這樣:
<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,請以實際表現為準)。
總結:用js原生的toFixed()來進行四捨五入,你很可能得到一個錯誤的結果。
其他可用的四捨五入方法 :
Math.round(xx.xxx*100)/100