原因がわかるまでに手間取ってしまったので、記録として残しておきます。
double型やBigDecimal型の変数の初期値を分数(例:2/3)で定義する際、小数点を入れないと「int型変数/int型変数」と判断されてしまい、小数点以下が切り捨てられた状態で変数に格納されてしまいます。
「2.0/3.0」なら可なのですが、「2/3」は不可です。
以下、サンプルコードです。
【失敗例】
・ソースコード
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());
}
}
・実行結果
double型変数の場合
期待値:0.6666666…
実際の値:0.0
BigDecimal型変数の場合
期待値:0.6666666…
実際の値:0.0
【成功例】
・ソースコード
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());
}
}
・実行結果
double型変数の場合
期待値:0.6666666…
実際の値:0.6666666666666666
BigDecimal型変数の場合
期待値:0.6666666…
実際の値:0.6666666666666666
---------------------------------
2019/05/18 追記
「double x = 2d/3d;」のような書き方でも可でした。
むしろこの書き方の方が一般的だと思います。