23

次のサンプルがあります(ideoneへのリンク)。

long lDurationMillis =  0;
lDurationMillis = Long.parseLong("30000.1");
System.out.print("Play Duration:" + lDurationMillis);

例外がスローされます。

Exception in thread "main" java.lang.NumberFormatException: For input string: "30000.1"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Long.parseLong(Long.java:419)
at java.lang.Long.parseLong(Long.java:468)
at Main.main(Main.java:9)

しかし、なぜその数値を文字列に直接変換できないのでしょうか?数値を整数に変換し、さらに double に変換できます。しかし、他の方法はありますか?

4

5 に答える 5

48

30000.1が無効な long 値です。最初に double 値を解析できます。

lDurationMillis = (long)Double.parseDouble("30000.1");
于 2012-10-04T17:15:00.310 に答える
7

この場合、 BigDecimal を使用できます。

BigDecimal bd = new BigDecimal("30000.1");
long l = bd.setScale(0, BigDecimal.ROUND_HALF_UP).longValue();
System.out.println(l);
于 2012-10-04T17:21:26.197 に答える
4

タイトルは、文字列を long に変換することを示しています。最初の質問は、数値を文字列に変換することについてであり、次のステートメントは、数値を整数から文字列に変換することです。私は混乱しています。

しかし、浮動小数点と関係がある場合は、必須のリファレンスWhat Every Computer Scientist Should Know About Floating-Point Arithmeticを参照する必要があります。

Java ではintlong小数部分がないため、文字列 like3000.1をこれらのいずれかに変換することはできません。floatorに変換することはできdoubleますが、上記の記事を読めば、カバーが失われる可能性があることに気付くでしょdoubleう。近いものを適切に定義するために、近いものになりますが、同じではない場合があります。String3000.1

正確な精度を使用したい場合は、 BigDecimalが役に立ちます。数値型よりもはるかに遅くなりますが、正確です。

于 2012-10-04T17:23:08.617 に答える
2

以下のように NumberFormat 処理を行うことができます。

long lDurationMillis =  0;
        try{
            NumberFormat nf = NumberFormat.getInstance();
            lDurationMillis = nf.parse("30000.1").longValue();
            System.out.print("Play Duration:" + lDurationMillis);
        }catch(ParseException e)
        {
            e.printStackTrace();
        }

出力:

Play Duration:30000
于 2016-09-02T11:51:57.477 に答える
2

long は小数部分を持つことができないため、double に変換してから、小数部分を無視して long にキャストできます。

于 2012-10-04T17:13:35.473 に答える