一、toFixed()
一般日常我們需要保留小數(shù)位數(shù)的時候猪腕,經(jīng)常會使用到toFixed()冗澈,但toFixed()實際上并不是四舍五入(如果精確度要求不高,能用就用吧)陋葡,而是叫銀行家舍入法亚亲,大部分的編程軟件使用的都是這種方法,也算是一種國際標準。
什么是銀行家舍入法?
所謂銀行家舍入法捌归,其實質(zhì)是一種四舍六入五取偶(又稱四舍六入五留雙)法肛响。
其規(guī)則是:當舍去位的數(shù)值小于5時,直接舍去該位惜索;當舍去位的數(shù)值大于等于6時特笋,在舍去該位的同時向前位進一;當舍去位的數(shù)值等于5且(5后不為空且非全0)時巾兆,在舍去該位的同時向前位進一雹有;當舍去的數(shù)值等于5且(5后為空或全0)時,如果前位數(shù)值為奇臼寄,則在舍去該位的同時向前位進一霸奕,如果前位數(shù)值為偶,則直接舍去該位吉拳。
簡單的說质帅,就是:四舍六入五考慮,五后非空就進一留攒,五后為空看奇偶煤惩,五前為偶應(yīng)舍去,五前為奇要進一炼邀。
以下是在Chrome瀏覽器下的計算結(jié)果魄揉,發(fā)現(xiàn)與上面的所說方法有所差異,那是因為浮點數(shù)造成的拭宁。至于細節(jié)可以戳這篇文章
二洛退、Math.round()
網(wǎng)上很多人說可以使用Math.round()來解決四舍五入的問題,但是實際上以下圖為例杰标,當乘以100后兵怯,會存在浮點數(shù)問題,最后還是無法得到精確的結(jié)果
三腔剂、解決方法
1媒区、引用庫
Math.js
decimal.js
big.js
...
2、自己寫方法
// 加法
Number.prototype.add = function(arg){
var r1,r2,m;
try{r1=this.toString().split(".")[1].length}catch(e){r1=0}
try{r2=arg.toString().split(".")[1].length}catch(e){r2=0}
m=Math.pow(10,Math.max(r1,r2))
return (this*m+arg*m)/m
}
//減法
Number.prototype.sub = function (arg){
return this.add(-arg);
}
//乘法
Number.prototype.mul = function (arg)
{
var m=0,s1=this.toString(),s2=arg.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)
}
//除法
Number.prototype.div = function (arg){
var t1=0,t2=0,r1,r2;
try{t1=this.toString().split(".")[1].length}catch(e){}
try{t2=arg.toString().split(".")[1].length}catch(e){}
with(Math){
r1=Number(this.toString().replace(".",""))
r2=Number(arg.toString().replace(".",""))
return (r1/r2)*pow(10,t2-t1);
}
}
計算對比