JAVA.BIGDEC.FLOAT

浮動小数点リテラルから BigDecimal オブジェクトを構築しない

脆弱性とリスク

浮動小数点値は小数点数を正確に表さないことがあり、BigDecimal() に小数点リテラルとして指定すると予期しない結果をまねく可能性があります。

軽減と防止

float 型を BigDecimal 型に解析せず、文字列または int/long を使用してください。浮動小数点の 10 進数リテラル値を文字列として指定してください。

脆弱コード例 1

コピー
package com.klocwork;

import java.math.BigDecimal;

public class JAVA_BIGDEC_FLOAT_POSITIVE_1 {
    public static void test(String args[]) {
        System.out.println(new BigDecimal(0.1));
    }
}

脆弱コード例 2

コピー
package com.klocwork;

import java.math.BigDecimal;

public class JAVA_BIGDEC_FLOAT_POSITIVE_2 {
    public static void test(String args[]) {
        System.out.println(new BigDecimal(7.321E-3));
    }
}

脆弱なコード例 3

コピー
package com.klocwork;

import java.math.BigDecimal;

public class JAVA_BIGDEC_FLOAT_POSITIVE_3 {
    public static void test(String args[]) {
        System.out.println(new BigDecimal(2f));
    }
}

修正コード例

コピー
package com.klocwork;

import java.math.BigDecimal;

public class JAVA_BIGDEC_FLOAT_NEGATIVE {
    public static void test(String args[]) {
        System.out.println(new BigDecimal(0));
    }
}

外部参考資料