原因がわかるまでに手間取ってしまったので、記事として残しておきます。
double型やBigDecimal型の変数の初期値を分数(例:2/3)で定義する際、小数点を入れないと「int型変数/int型変数」と判断されてしまい、小数点以下が切り捨てられた状態で変数に格納されてしまいます。
「2.0/3.0」なら可なのですが、「2/3」は不可です。
以下、サンプルコードです。
【失敗例】
・ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
package main; import java.math.BigDecimal; public class Main { public static void main(String[] args) { // double型(実行速度重視) double x = 2/3; System.out.println("double型変数の場合"); System.out.println("期待値:0.6666666…"); System.out.println("実際の値:"+x); // BigDecimal型(丸め誤差を気にする場合) BigDecimal y = BigDecimal.valueOf(2/3); System.out.println("BigDecimal型変数の場合"); System.out.println("期待値:0.6666666…"); System.out.println("実際の値:"+y.doubleValue()); } } |
・実行結果
1 2 3 4 5 6 7 |
double型変数の場合 期待値:0.6666666… 実際の値:0.0 BigDecimal型変数の場合 期待値:0.6666666… 実際の値:0.0 |
【成功例】
・ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
package main; import java.math.BigDecimal; public class Main { public static void main(String[] args) { // double型(実行速度重視) double x = 2.0/3.0; System.out.println("double型変数の場合"); System.out.println("期待値:0.6666666…"); System.out.println("実際の値:"+x); // BigDecimal型(丸め誤差を気にする場合) BigDecimal y = BigDecimal.valueOf(2.0/3.0); System.out.println("BigDecimal型変数の場合"); System.out.println("期待値:0.6666666…"); System.out.println("実際の値:"+y.doubleValue()); } } |
・実行結果
1 2 3 4 5 6 7 |
double型変数の場合 期待値:0.6666666… 実際の値:0.6666666666666666 BigDecimal型変数の場合 期待値:0.6666666… 実際の値:0.6666666666666666 |
コメント