Java

float型を使うときの入力値の境目チェックに注意

More than 1 year has passed since last update.

最初に

たまたまfloatで発見しただけで、doubleでも値を調べれば同様のことは起きると思います。

テストコード

public class Main {
    public static void main(String[] args) throws Exception {

        System.out.println("Float.parseFloat(999999967)  --> " + Float.parseFloat("999999967"));
        System.out.println("Float.parseFloat(999999968)  --> " + Float.parseFloat("999999968"));
        System.out.println("Float.parseFloat(999999969)  --> " + Float.parseFloat("999999969"));
        System.out.println("Float.parseFloat(999999999)  --> " + Float.parseFloat("999999999"));
        System.out.println("Float.parseFloat(1000000000) --> " + Float.parseFloat("1000000000"));
        System.out.println("Float.parseFloat(1000000001) --> " + Float.parseFloat("1000000001"));
        System.out.println("Float.parseFloat(1000000010) --> " + Float.parseFloat("1000000010"));
        System.out.println("Float.parseFloat(1000000020) --> " + Float.parseFloat("1000000020"));
        System.out.println("Float.parseFloat(1000000030) --> " + Float.parseFloat("1000000030"));
        System.out.println("Float.parseFloat(1000000031) --> " + Float.parseFloat("1000000031"));
        System.out.println("Float.parseFloat(1000000032) --> " + Float.parseFloat("1000000032"));
        System.out.println("Float.parseFloat(1000000033) --> " + Float.parseFloat("1000000033"));
        System.out.println("Float.parseFloat(1000000034) --> " + Float.parseFloat("1000000034"));
        System.out.println("Float.parseFloat(1000000035) --> " + Float.parseFloat("1000000035"));
        System.out.println("Float.parseFloat(1000000040) --> " + Float.parseFloat("1000000040"));

    }

}

実行結果

Float.parseFloat(999999967)  --> 9.9999994E8
Float.parseFloat(999999968)  --> 1.0E9
Float.parseFloat(999999969)  --> 1.0E9
Float.parseFloat(999999999)  --> 1.0E9
Float.parseFloat(1000000000) --> 1.0E9
Float.parseFloat(1000000001) --> 1.0E9
Float.parseFloat(1000000010) --> 1.0E9
Float.parseFloat(1000000020) --> 1.0E9
Float.parseFloat(1000000030) --> 1.0E9
Float.parseFloat(1000000031) --> 1.0E9
Float.parseFloat(1000000032) --> 1.0E9
Float.parseFloat(1000000033) --> 1.00000006E9
Float.parseFloat(1000000034) --> 1.00000006E9
Float.parseFloat(1000000035) --> 1.00000006E9
Float.parseFloat(1000000040) --> 1.00000006E9

Webでの動作確認用URL

https://paiza.io/projects/KMTyqbyvAG1M_8KslEVWiQ

まとめ

999,999,999と1,000,000,000がfloatに変換すると同じ値になってしまいます。
それだけではなく、999,999,968から1,000,000,032までが同じ値と判断されます。

999,999,999 より大きい値(=1,000,000,000)を入れたらエラーとしたい、というようなチェックを行う際には気を付けましょう、という例でした。
この例でいえば、doubleを使うか、BigDecimalを使うかの2択で、出来ればBigDecimalを使うのが望ましいです。