将包含十进制的String转换为Long

我有以下示例( 链接到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。 但还有其他方法吗?

30000.1是无效的长值。 您可以先解析double值:

 lDurationMillis = (long)Double.parseDouble("30000.1"); 

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

但是对于与浮点有关的任何事情,我必须指出你必须参考每个计算机科学家应该知道的浮点运算 。

在java中, intlong没有小数部分,因此像3000.1这样的字符串不能与其中一个相关联。 它可以转换为floatdouble但是如果你阅读上面的文章,你会发现转换可能是有损的,即如果你可以将这个doubleString你可能无法获得原来的3000.1 。 对于适当的近距离定义,这将是接近的,但可能不一样。

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

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

在这种情况下你可以使用BigDecimal:

 BigDecimal bd = new BigDecimal("30000.1"); long l = bd.setScale(0, BigDecimal.ROUND_HALF_UP).longValue(); System.out.println(l); 

你可以使用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