Javaの暗黙の型変換による小数点以下の切り捨てを防ぐ方法

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

コメント

タイトルとURLをコピーしました