我有以下示例(link to 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。但还有其他方法吗?
答案 0 :(得分:35)
值30000.1
是无效的长值。您可以先解析double值:
lDurationMillis = (long)Double.parseDouble("30000.1");
答案 1 :(得分:4)
标题说将字符串转换为long,第一个问题是关于将数字转换为字符串,下一个关于将数字转换为整数到字符串的语句。我很困惑。
但是对于与浮点有关的任何事情,我必须指出你必须参考What Every Computer Scientist Should Know About Floating-Point Arithmetic 。
在java中,int
和long
没有小数部分,因此像3000.1
这样的字符串不能与其中一个字符串共存。它可以转换为float
或double
,但如果您阅读上述文章,您会发现转换可能是有损的,即如果您将double
转换回String
你可能不会得到原来的3000.1
。对于适当的近距离定义,它会很接近,但可能不一样。
如果您想使用精确的精确度,那么BigDecimal就是您的朋友。它会比数字类型慢很多,但它会很精确。
答案 2 :(得分:3)
在这种情况下你可以使用BigDecimal:
BigDecimal bd = new BigDecimal("30000.1");
long l = bd.setScale(0, BigDecimal.ROUND_HALF_UP).longValue();
System.out.println(l);
答案 3 :(得分:2)
因为长期不能包含小数部分,您可以将其转换为double,然后将其转换为长忽略小数部分
答案 4 :(得分:1)
你可以使用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