プログラミングを上達させたい

プログラミングの勉強を始めた、情報学専攻の大学院生です。モチベーション維持のため、ブログに勉強したことを書いていきます。→就職。IT全然関係ない仕事をしています

Javaで、小数の四捨五入や、小数点以下を指定して出力するなど

さて、AtCoderで毎日やるのもいいんですが、こう、なにか蓄積されるような?感じがいいなということで、別のサイトも使いはじめました。
かの有名な会津オンラインジャッジ(AOJ)Project Eulerです。
ただ、いまはProject Eulerはなんか問題があったとかで繋がらないようなので、こっちのサイトを見て解いています。
ペースとしては2つとも1日1問です。
なるべく途切れることのなく、毎日続けていけたら、と思っています。
ちなみにAOJではJava、Project EulerではSchemeで解いています。


さて、今日AOJの0004番を解きました。
方程式を解く、というやつです。
数学的に考えると、読み込んだ数たちの加減乗除だけで求まる問題ですが、僕が引っかかったところが
『各値は小数点以下第3位まで出力して下さい。小数点以下第4位を四捨五入して下さい。』
というとこです。
もともと、Javaは詳しくないので(;で終わる、とか、それくらいの知識)、色々調べていました。


まず、四捨五入に関してから。

もちろん、特殊なことをせずに四捨五入する方法もあります。
たとえば、今回みたいに小数点以下第4位を四捨五入するには、こうすればいいですね。

;double型の変数aの小数点以下第4位を四捨五入する
	double a = 0.43342;
	int b;
	int c;
	b = (int)(a*10000);   //   b = 4334
	c = b % 10;   //   c = 4 ←小数点以下第4位
	b -= c;

//四捨五入する
	if(c >= 5){
		b += 10;
	}
	a = ((double)b)/10000;   //これでaが小数点第4位で四捨五入された

しかし、なんかこう、面倒くさい・・・
というわけで、こんな方法を見つけました。こちらのサイトを参考にしました。

import java.math.*;
;double型の変数aの小数点以下第4位を四捨五入する
double a = 0.43342;
BigDecimal x = new BigDecimal(a);
x = x.setScale(3, BigDecimal.ROUND_HALF_UP);
//これでxにaの小数点以下第4位を四捨五入した結果が入る

こっちの方が楽そうですね。

そして、出力の方。
小数点以下何桁までを出力するか、ですね。
それは次のようにやればOKです。

;double型の変数xを小数点以下3桁まで表示する。整数部分はあるだけ表示する。
System.out.printf("%.3f",x);

たいてい検索して探したやつでは、

;全部で5桁分の幅を使い、小数点以下は2桁まで表示する
System.out.printf("%5.2f",x);

という説明ばかりだったのですが、ダメ元で

"%.3f"

としてみたら出来ました。
ラッキーラッキー。
もしくは、formatというのを使う方法もあるようですが(先ほどのサイトにありました)、違いがよくわかんないっす。へへ

という感じでした。
今回は以上です。