Java 将包含小数的字符串转换为长字符串
我有以下示例() 它抛出一个异常:Java 将包含小数的字符串转换为长字符串,java,Java,我有以下示例() 它抛出一个异常: 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.pa
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)
但为什么它不让我直接把数字转换成字符串呢?我可以把数字转换成整数,然后再转换成双精度。但是还有其他方法吗?因为long不能有小数部分,所以可以将其转换为double,然后将其转换为long忽略小数部分值
30000.1
是无效的long值。您可以首先解析双精度值:
lDurationMillis = (long)Double.parseDouble("30000.1");
在这种情况下,可以使用BigDecimal:
BigDecimal bd = new BigDecimal("30000.1");
long l = bd.setScale(0, BigDecimal.ROUND_HALF_UP).longValue();
System.out.println(l);
标题说将字符串转换为长字符串,第一个问题是关于将数字转换为字符串,下一个语句是关于将数字转换为整数转换为字符串。我很困惑 但对于任何与浮点有关的问题,我必须让你们看到强制性的参考 在java中,
int
和long
没有小数部分,因此像3000.1
这样的字符串不能与其中一个合并。它可以转换为float
或double
,但如果您阅读了上述文章,您将意识到转换可能会有损,即如果您可以将double
转换回字符串
,则可能无法恢复原始的3000.1
。这将是接近的东西,对于接近的适当定义,但可能不一样
如果你想使用精确的精度,那就是你的朋友。它将比数字类型慢得多,但它将是精确的 您可以按如下方式进行数字格式处理:
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
为什么不使用
double.parseDouble(文本)将十进制直接转换为double
代码>或使用新的BigDecimal(文本)转换为BigDecimal代码>标题说将字符串转换为长字符串,第一个问题是关于将数字转换为字符串,下一个语句是关于将数字转换为整数转换为字符串。我不明白你的意思。例如,您可以使用Long将任何数字转换为String
。toString(Long l)
。Long.toString(Long l)也会产生相同的错误您是否知道30000.1
不是有效的Long?我已经了解到使用双精度
数据类型可能会导致精确的错误。这不能在这里发生吗?这可能只发生在数字的小数部分。不可分割的部分将很好:)
Play Duration:30000