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)

但为什么它不允许我直接将该数字转换为字符串?我可以将数字转换为整数,而不是转换为双精度。但是还有其他方法吗?

4

5 回答 5

48

该值30000.1是无效的长值。您可以先解析双精度值:

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

标题说将字符串转换为长,第一个问题是关于将数字转换为字符串,下一个关于将数字转换为整数到字符串的语句。我很困惑。

但是对于与浮点有关的任何事情,我必须向您指出强制性参考What Every Computer Scientist Should Know About Floating-Point Arithmetic

在 java 中,int并且long没有小数部分,因此3000.1无法将类似字符串的字符串转换为其中之一。它可以转换为floatordouble但是如果您阅读了上面的文章,您会意识到覆盖可能是有损的,即如果您可以将其转换double回 aString您可能无法获得原始版本3000.1。对于关闭的适当定义,这将是接近的东西,但可能不一样。

如果您想使用精确的精度,那么BigDecimal是您的朋友。它会比数字类型慢得多,但它会很精确。

于 2012-10-04T17:23:08.617 回答
2

因为 long 不能有小数部分,您可以将其转换为 double 然后将其转换为 long 忽略小数部分

于 2012-10-04T17:13:35.473 回答
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 回答