文章出處

  JavaScript庫函數toFixed用來將給定的數字四舍五入為指定的小數位數,W3school上有詳細的介紹。眾所周知,在處理小數位四舍五入的時候存在兩種方式:一種是逢五進一,如5.885保留兩位小數則是5.89;另一種是逢六進一,如5.885保留兩位小數后仍然是5.88,5.886保留兩位小數則是5.89。JavaScript的toFixed庫函數沒有提供專門的參數用來指示如何對給定的數字進行四舍五入,瀏覽器會按照默認的方式進行處理,如IE會按照逢五進一的方式對數字進行四舍五入,Chrome和Firefox則是按照逢六進一的方式。

  注意,JavaScript的Round函數不能被用來進行小數位四舍五入,按照W3school上的說明,該函數可把一個數字舍入為最接近的整數。

  另外,C#中有專門的枚舉變量用來指示如何對數字進行四舍五入,http://msdn.microsoft.com/zh-cn/library/system.midpointrounding.aspx

Math.Round(123.45, 1, MidpointRounding.AwayFromZero); // 返回123.5
Math.Round(123.45, 1, MidpointRounding.ToEven); // 返回123.4
Math.Round(123.45); // 返回123

  鑒于JavaScript的toFixed函數的不確定性,我們不得不自己編寫方法來進行小數位數的四舍五入。下面的代碼可以滿足一般精度的運算。

function toFixed( number, precision ) {
    var multiplier = Math.pow( 10, precision );
    return Math.round( number * multiplier ) / multiplier;
}

  需要注意的是,JavaScript對高精度數學運算的支持并不是特別精準,如果你要處理的數字具有較高的精度,上面的方法返回的結果可能存在一定的誤差,在使用的時候要小心。

  關鍵是被舍入的那一位數字是5如何進行取舍的問題!這里還存在一個正數和負數的問題,同一個數字,正數的情況和負數的情況計算出來的結果也不盡相同。所以,我們不得不對上面這個函數做進一步修改,當數字為負數時,先對其絕對值進行計算,然后再補充負號。

function toFixed(number, precision) {
    var b = 1;
    if (isNaN(number)) return number;
    if (number < 0) b = -1;
    var multiplier = Math.pow(10, precision);
    return Math.round(Math.abs(number) * multiplier) / multiplier * b;
}

  不太明白JavaScript中的數學運算函數為什么有這么多計算上的問題,是不是在設計之初有什么特殊的考慮呢?


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()