在PHP中,Round()函式可以傳入兩個參數,第一個通常是帶有小數的浮點數,而第二個是想取得小數位數。現在寫ActionScript,發現它的Math.Round()並沒有所謂的第二個參數,囧rz(這麼好的參數竟然就不見了),而且好像Javascript也是一樣,沒有第二參數。只好自己手刻函式來強化了,幸好追加這個參數也沒什麼難度可言,只要先將【數值x(欲求的小數位*10)】進行Math.Round()後,再除於(欲求的小數位*10)。嗯…還是直接看下列的函式吧。
/**
* RoundX
* 強化的四捨五入
*
* @param float val 浮點數
* @param int precision 小數位數
*/
function roundX(val, precision){
//理論上版本
var precision = precision || 0; //預設0位數
var a = val * Math.pow(10, precision); //320007.5
var b = Math.round(a); //320008
var c = b / Math.pow(10, precision); //32.0008
//return c;
//理論版濃縮
//return Math.round(val * Math.pow(10, (precision || 0))) / Math.pow(10, (precision || 0));
//修正誤差版本。但因為浮點計算產生的誤差,會導致結果錯誤
//例如32.00075*1000會是320007.49999999994,而不是預期的320007.5
var precision = precision || 0; //預設0位數
var a = val * Math.pow(10, precision + 1); //3200074.9999999995
var b = Math.round(a) / 10; //320007.5
var c = Math.round(b); //320008
var d = c / Math.pow(10, precision); //32.0008
//return d;
//修正版縮濃
return Math.round(Math.round(val * Math.pow(10, (precision || 0) + 1)) / 10) / Math.pow(10, (precision || 0));
}
/*
以下以PHP的範例再做一次AS版的測試
trace( roundX(3.4)); // 3
trace( roundX(3.5)); // 4
trace( roundX(3.6)); // 4
trace( roundX(3.6, 0)); // 4
trace( roundX(1.95583, 2)); // 1.96
trace( roundX(1241757, -3));//1242000
trace( roundX(5.045, 2)); // 5.05
trace( roundX(5.055, 2)); // 5.06
trace( roundX(0.7142857142857143, 2)); // 0.71
trace( roundX(32.00075, 4)); // 32.0008
*/
筆者發現因為浮點數的誤差關係,像是32.00075四捨五入到小數第四位,會發生錯誤,於2013/1/17進行了修正
文章標籤
全站熱搜

直接用 toFixed() 就好了 orz||
的確,在不考慮JS的版本前,toFixed() 是個好辦法呢。謝謝你的提醒。不過有些瀏覽器中,toFixed 似乎有精度問題。