以數學的原理處理四捨五入

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

以四捨五入取整數的例子來講,其原理就是: 任何數值+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);
}
document.write(round1(12.345 , 2) + "<br />");
document.write(round2(12.345 , 2));
</script>

round1() 及 round2() 函式的第一個參數為欲轉換的數值,第二個參數為欲取得的位數

    • 晴樹
    • 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 位部落客按了讚: