« Fizz Buzz問題で見るべきポイント | トップページ | DevOpsを阻むもの »

2014.02.17

四捨五入関数がない環境下での対応

ちょっと連荘でFizzBuzz系のネタを。
現在では多くの処理系でこの機能は存在しているので、わざわざ一から実装しなくてはいけないケースってどのくらいあるのかわからないが、四捨五入がさくっとできないといろいろと不便なことがあるのは事実だよね。

私が初めて書いたのはMS Access95のクエリ上で、どうしても四捨五入をしたかったケース。
もう15年以上前に書いたものなのね。今見ると恥ずかしい。

Function rs(i As Double, s As Byte)
  i = i * 10 ^ s + 0.5
  i = int(i) / 10 ^ s
  rs = i
End Function

肝となるのは
「整数値を取得するint関数(floorとかceilとか類似処理系でよい)」
「0.5を加えて処理する」
というところだろう。0.5以上の数値に0.5を足せば繰り上がるし、0.5未満の数値に0.5を足しても1には達しないので、整数値を取るint関数では前者であれば1、後者であれば0が取得できる。
上記の関数はもうちょっと汎用性をもたせて第何位で四捨五入できるかを引数"s"を使って実現している。

コード自体はVBA用のものであるが、考え方はどの処理系でも利用できるであろう。

上述の基本を押さえておくことで、いろいろと応用が効くので一度は四捨五入関数を若い子には作らせることにしている。
とはいえ、いずれも準備されている関数群を使うほうがわかりやすく便利である。
学習用以外の用途で上記関数を自作する必要性は、多くの処理系において不要であろう。



以下はいろいろな処理系での四捨五入処理のサンプル。

◆perl

Math::Roundモジュールのroundまたはnearestメソッドを使う
use strict;
use Math::Round;

print nearest(1, 198.54), "\n"; # 199

※ただしこのモジュールの実装はけっこう力技らしいけど……

◆JAVA

setScaleメソッドを使う
import java.math.BigDecimal;
public class getRound(){
 public static void main(String args[]) {

  double val = 198.54;
  BigDecimal bd = new BigDecimal(val);

  double ret = bd.setScale(0,BigDecimal.ROUND_HALF_UP).doubleValue();
  System.out.println("小数第一位で四捨五入:"+ret);
}


◆PHP

round関数を使う
<?php
echo round(198.54,1);
?>

◆Excel

roundワークシート関数を使う
=round(198.54,1)
コレ最強w。

|

« Fizz Buzz問題で見るべきポイント | トップページ | DevOpsを阻むもの »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/2022/59150537

この記事へのトラックバック一覧です: 四捨五入関数がない環境下での対応:

« Fizz Buzz問題で見るべきポイント | トップページ | DevOpsを阻むもの »