ソフトウェア開発したい日記

「面白い!」と思った頭の体操や、数学の問題を載せていきます
その他ロードバイクででかけた先の写真や、ソフト開発のメモ等

Javaとかで高速に小数点以下四捨五入をしたい

2010年09月07日 14時06分01秒 | ソフト開発日記
Javaで、(多分Cや他の言語でも大体同じ)
小数点以下を四捨五入するために、Math.roundメソッドが用意されている。

何度か四捨五入したいだけれあれば、Math.roundメソッドを使えばいいけど
ループの中で何十万回と呼び出すとき毎回Math.roundメソッド呼び出してたらかなり遅くなってしまう。

そこでMath.roundメソッドを用いないプログラムメモ。

まず、Math.roundメソッドの処理は多分こんな感じ

public static long round(double a){
  return(floor(a + 0.5));
}

0.5を加えて、Math.floorメソッドを使用する。
Math.floorメソッドは引数以下の最大の整数を返すメソッド。
小数点以下切り捨てのようなもの。
0.5を加えることで、小数点以下が5以上であれば整数部が1増える仕組み。

Math.floorメソッドを利用すればMath.roundメソッドを使わなくて済むが
Math.floorメソッド呼び出してたらあまり意味がない。

Math.floorメソッドの中身は多分こんな感じ。

public static double floor(double a){
  a += 0.5
  if(a > 0) return((int)a);
  else   return((int)a - 1);
}

多分厳密には違うけど、こんなんだと思う。
注意すべきは、単純な小数点以下切り捨てではなく
ガウス記号同様、その数を超えない最大の整数というわけなので
例えば-0.6なんかは-1.0にする必要があるということ。

(int)によるキャストでは完全に切り捨てになってしまうので
負の値であったら-1してやる必要があります。

これだけわかればMathクラスを利用せず
小数点以下四捨五入が多分できます。
というかできました。

現在作ってるプログラムでは
209715200(約2.1億)回四捨五入するのですが、

速度は大体20秒⇒4秒くらいに縮みました。