Javaで四捨五入をするには
Javaで四捨五入をするには、提供されるメソッドを用います。いくつかの関係するメソッドがありますので、提供されるメソッドを利用したり、メソッドなしに記述したりしてコードを作成します。ここでは、Javaで四捨五入を行う方法全般を解説します。
【参考】:Oracle: Java SE ドキュメント 【参考】:Oracle: Java Language and Virtual Machine Specifications
Javaで四捨五入を行うメソッド
Javaには、四捨五入を行うメソッドがいくつか用意されています。四捨五入はプログラム言語ごとに、言語仕様上の特徴があります。ここでは、Javaで一般的に利用するroundメソッドを中心に解説し、理解を深めます。
roundメソッドを使用する
roundメソッドは、小数点第1位を四捨五入し、最も近い整数値を返します。使い方は、roundメソッドにfloatあるいはdoubleの引数を渡すだけです。
ここでは、例として円周率πの四捨五入を実行します。
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
// 円周率
double parm=Math.PI;
System.out.println("PI="+parm);
System.out.println("round="+Math.round(parm));
}
}
実行結果は次のように、小数点以下1位で四捨五入し、整数を返します。
PI=3.141592653589793
round=3
roundメソッドを小数点以下に使用する
roundメソッドは、小数点以下1位で四捨五入し、整数を返します。そのため小数点以下の演算結果を求めるには、工夫が必要です。roundメソッドの仕様を考えると、10進数であれば10倍したroundメソッドの結果を、1/10にすると1桁ずらして小数点以下の計算ができることに気が付きます。
ここでは、例として小数点第2位で四捨五入する場合を考えます。
10進数では基数は10、ここでは”base=10”とします。指数を2、”expo=2”とすると、100で2桁繰り上がります。この値が格納された”result”変数を使って、roundメソッドの演算を行い、元の桁である2桁分、結果を繰り下げます。
小数点以下第2位を計算するサンプルコードを、以下に示します。
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
// 円周率
double parm=Math.PI;
// 桁数を指定
double expo=2; //この場合は小数点以下第2位
double base=10;
double result=Math.pow(base,expo);
System.out.println("PI="+parm);
System.out.println("round="+Math.round(parm*result)/result);
}
}
演算結果は、以下の通りです。
PI=3.141592653589793
round=3.14
この方法は、小数点第1位のほか小数点第3位や小数点第4位以上においても利用できます。小数点第3位の場合は、”rate=3”に設定することで次のように結果が得られます。ここでは、自動的に桁数を切り替えて結果を表示するプログラムを作成しました。
次のコードを見てみましょう。
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
// 円周率
double parm=Math.PI;
System.out.println("PI="+parm);
System.out.println("round="+Math.round(parm));
// 桁数を指定
double base=10;
for (int i=1;i<9;i++){
double expo=i;
double result=Math.pow(base, expo);
System.out.println
("round("+i+")="+Math.round(parm*result)/result);
}
}
}
実行結果は、次のように表示されます。
PI=3.141592653589793
round=3
round(1)=3.1
round(2)=3.14
round(3)=3.142
round(4)=3.1416
round(5)=3.14159
round(6)=3.141593
round(7)=3.1415927
round(8)=3.14159265
このように、少しの工夫で四捨五入を桁数指定で行うことができます。なお、桁の繰り上げや繰り下げをこれ以上行う場合は、許容できる値の範囲を超えてしまい、演算誤差が生じる場合があります。使用する場合は、実行結果を確認しながら行いましょう。
Javaの四捨五入をさらに詳しく
ここまでの解説で、Javaのメソッドによる四捨五入を使うことができました。Javaでは切り上げや切り捨て、あるいは精度向上のためのクラスが用意されています。ここからは、さらに詳しくJavaの用法を見ていきます。
四捨五入ではなく切り上げを行う
Javaで切り上げを行うには、ceilメソッドを使います。引数で与えた数値に対して切り上げた整数を戻します。
小数点以下の切り捨てや10の位や100の位で切り上げを行うには、値を10倍や100倍、1/10や1/100にして再度結果に1/10や1/100、10や100などを掛けます。これは、roundメソッドの桁の繰り上げや繰り下げと同じです。コードのサンプルは次の通りです。
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
// 円周率
double parm=Math.PI;
System.out.println("PI="+parm);
System.out.println("ceil="+Math.ceil(parm));
// 桁数を指定
double base=10;
for (int i=1;i<9;i++){
double expo=i;
double result=Math.pow(base, expo);
System.out.println("ceil("+i+")="+Math.ceil(parm*result)/result);
}
}
}
実行結果は、次の通りです。
PI=3.141592653589793
ceil=4.0
ceil(1)=3.2
ceil(2)=3.15
ceil(3)=3.142
ceil(4)=3.1416
ceil(5)=3.1416
ceil(6)=3.141593
ceil(7)=3.1415927
ceil(8)=3.14159266
四捨五入ではなく切り捨てを行う
四捨五入ではなく切り捨てを行うには、floorメソッドを使います。floorの場合も、任意の桁数で切り捨てを行うには、roundメソッドやceilメソッドの桁の繰り上げや繰り下げと同じです。詳しくは次のコードを確認してください。
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
// 円周率
double parm=Math.PI;
System.out.println("PI="+parm);
System.out.println("floor="+Math.floor(parm));
// 桁数を指定
double base=10;
for (int i=1;i<9;i++){
double expo=i;
double result=Math.pow(base, expo);
System.out.println
("floor("+i+")="+Math.floor(parm*result)/result);
}
}
}
結果は、次のようになります。
PI=3.141592653589793
floor=3.0
floor(1)=3.1
floor(2)=3.14
floor(3)=3.141
floor(4)=3.1415
floor(5)=3.14159
floor(6)=3.141592
floor(7)=3.1415926
floor(8)=3.14159265
BigDecimalクラスでさらに精度よく演算する
Javaでは、計算精度を向上させるために、BigDecimalクラスを用意しています。四捨五入や切り上げ、切り捨てに対応します。プログラムコードをもう少し詳しく見ると、使用するBigDecimal.setScale()には、2つの引数があることが分かります。
BigDecimal.setScale(第1引数、第2引数)で指定した第1引数が小数点以下の位、つまり小数点以下の桁の位置を示します。
第2引数は、演算の指示です。四捨五入で用いるBigDecimal.ROUND_HALF_UPのほか、BigDecimal.ROUND_DOWNが切り捨て、BigDecimal.ROUND_UPが切り上げで、いずれかを選択します。
実際の四捨五入のサンプルコードは以下の通りです。
import java.util.*;
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) throws Exception {
// 円周率
double parm=Math.PI;
System.out.println("PI="+parm);
BigDecimal bd_val = new BigDecimal(String.valueOf(parm));
// 桁数を指定
for (int i=0;i<9;i++){
BigDecimal bd_ret = bd_val.setScale(i,BigDecimal.ROUND_HALF_UP);
System.out.println("bd("+i+")="+bd_ret);
}
}
}
実行結果は、次の通りです。
PI=3.141592653589793
bd(0)=3
bd(1)=3.1
bd(2)=3.14
bd(3)=3.142
bd(4)=3.1416
bd(5)=3.14159
bd(6)=3.141593
bd(7)=3.1415927
bd(8)=3.14159265
BigDecimalクラスでは、得られた値に対して四則演算のメソッドを併用し、精度よく計算を行います。
四捨五入をメソッドなしで行うには
roundをはじめ、JavaのメソッドはCPUを消費することが知られています。Javaの四捨五入は、性能を重視するような場合は、メソッドを使わずに自作することも可能です。考え方はシンプルで、floatやdoubleの浮動小数点型のデータを整数型のintにキャストするだけです。
値に0.5を加えると、キャストすることによって四捨五入が成立します。値が負の場合は加算ではなく、減算することで対応できます。その後、整数型のデータを再度元のdoubleなどの変数型に戻すことで、四捨五入が成立します。
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
// 円周率
double parm=Math.PI;
System.out.println("PI="+parm);
// 桁数を指定
int base=10;
for (int i=0;i<9;i++){
int val=1;
for (int j=i;j>0;j--){
val *= base;
}
double calc = parm*val;
// 四捨五入のオフセット値を追加する
if (calc >=0) {
calc += 0.5;
}
else {
calc -= 0.5;
}
// ここで小数点以下をキャストする
int int_parm=(int) calc;
// 元の変数型に戻す
double result = (double) int_parm/(double) val;
System.out.println("result("+i+")="+result);
}
}
}
実行結果は、以下の通りです。
PI=3.141592653589793
result(0)=3.0
result(1)=3.1
result(2)=3.14
result(3)=3.142
result(4)=3.1416
result(5)=3.14159
result(6)=3.141593
result(7)=3.1415927
result(8)=3.14159265
Javaの四捨五入は難しくない
Javaの四捨五入は桁数が小数点第1位と決まっているため、桁数を変える場合は一工夫が必要です。最初は慣れるまで戸惑うかもしれませんが、しっかりと動作を確認しましょう。
Javaのコードは再利用できるため、基本的な処理が決まったらクラスやメソッドを登録し、再利用するのがおすすめです。
その他のJava関連記事
その他、Javaに関連する内容は、下記の記事でもご紹介しています。ぜひ参考にご覧ください。
編集部オススメコンテンツ
アンドエンジニアへの取材依頼、情報提供などはこちらから