[Perl][JavaScript]以數學的原理處理四捨五入

我看過太多人都把四捨五入的問題看成是「字串」來處理,實際上,如果把四捨五入做為「數學」來解的話,程式大概只要幾行即可解決。

以四捨五入取整數的例子來講,其原理就是: 任何數值 +0.5 再取整數

但要注意的是,當四捨五入遇到「負數」時就會變成「五捨六入」,這是因為中間數要往數值大的那邊進位的緣故。所以加上了負數的處理,程式至少又多了一行:

Perl 的四捨五入

sub round{
  my($value, $rank) = @_;
  if($value > 0){
    return (int($value * 10**$rank) + 0.5) / 10**$rank;
  }
  else{
    return (int($value * 10**$rank) - 0.4) / 10**$rank;
  }
}
print round(12.345, 2);

round() 函式的第一個參數為欲轉換的數值,第二個參數為欲取得的小數點位數

JavaScript 的四捨五入

<script type='text/javascript'>
//方法一
function round1(value, rank){
  if(value >= 0){
    return parseInt(value * Math.pow(10, rank) + 0.5) / Math.pow(10, rank);
  }
  else{
    return parseInt(value * Math.pow(10, rank) - 0.4) / Math.pow(10, rank);
  }
}
//方法二: 使用內建的 round() 數學函數
function round2(value, rank){
  return Math.round(value * Math.pow(10, rank)) / Math.pow(10, rank);
}
//方法三: 使用內建的 toFixed() 函數 (傳回字串)
function round3(value, rank){
  return Number.parseFloat(value).toFixed(rank);
}
console.log(round1(12.345, 2)); // 12.35
console.log(round2(12.345, 2)); // 12.35
console.log(round3(12.345, 2)); // "12.35"
</script>

這三個自訂函式的第一個參數為欲轉換的數值,第二個參數為欲取得的位數

    • 晴樹
    • 08/21. 2008 9:29上午
    Using Mozilla Firefox Mozilla Firefox 3.0 on Windows Windows Vista

    很不錯的文章

    像有些語言提供現成的round(),其實是『四捨六入五成雙』
    判斷方式就有點小差異

    • cvictor
    • 08/26. 2008 12:38上午
    Using Mozilla Firefox Mozilla Firefox 2.0.0.16 on Windows Windows XP

    負數的處理有點問題喔。還是要減0.5才對。

    • 小迪
    • 10/12. 2011 4:24下午
    Using Internet Explorer Internet Explorer 8.0 on Windows Windows XP

    呵呵,0.5中間值

  1. No trackbacks yet.

return top

%d 位部落客按了讚: