技術とか戦略とか

IT技術者が技術や戦略について書くブログです。

java:暗黙の型変換による意図しない小数点以下切り捨て

原因がわかるまでに手間取ってしまったので、記録として残しておきます。
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;」のような書き方でも可でした。
むしろこの書き方の方が一般的だと思います。