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秒くらいに縮みました。
小数点以下を四捨五入するために、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秒くらいに縮みました。