如何为十进制数字做Integer.parseInt()?


76

Java代码如下:

String s = "0.01";
int i = Integer.parseInt(s);

但是,这引发了NumberFormatException ...可能出了什么问题?

Answers:


66

0.01不是整数(整数),因此您当然不能将其解析为一个整数。使用Double.parseDoubleFloat.parseFloat代替。


94
String s = "0.01";
double d = Double.parseDouble(s);
int i = (int) d;

出现异常的原因是整数不包含有理数(基本上是分数)。因此,尝试解析0.3为int是胡说八道。一个double或一个float数据类型可以容纳有理数。

Java将a转换double为an的方式int是通过将小数点分隔符后的部分舍入为0来完成的

int i = (int) 0.9999;

i 将为零。


2
您的演员表将完全丢失分数信息。我不确定这是个好建议。
Joren

1
好!也许我将不得不做这样的事情Double d = Double.parseDouble(s); 对?
凯文·博伊德

1
@Kevin:是的,但是您也可以使用“ double”而不是“ Double”
Martijn Courteaux 09年

1
他说他想要一个整数,但是我们确定那是他所需要的吗?
Joren



9

实际上,这种转换在Java中是难以理解的

例如下面的字符串:“ 100.00”

C:至少从1971年起就提供了一个简单的标准库函数“ atoi”这个名字是从哪里来的?

int i = atoi(decimalstring);

Java:通过Double(或Float)解析强制转换,然后强制转换

int i = (int)Double.parseDouble(decimalstring);

Java肯定有一些奇怪之处


C只需忽略字符串的其余部分,然后解析它可以解析的任何内容(在本例中为100)。您无法知道是否atoi实际解析了字符串中的所有内容,字符串是否包含数字或数字是否溢出类型。strtol是可以检测到以上所有情况的更好的替代方法。Java更加严格,但是可以确保涵盖所有这些情况。
nhahtdh 2013年

我同意Raywell的观点,因为这行得通,Double.valueOf("16543").intValue();所以当您想快速转换为int时,Java希望成为PITA,而Double则更为通用。
某处某人

4

使用BigDecimal进行舍入:

String s1="0.01";
int i1 = new BigDecimal(s1).setScale(0, RoundingMode.HALF_UP).intValueExact();

String s2="0.5";
int i2 = new BigDecimal(s2).setScale(0, RoundingMode.HALF_UP).intValueExact();

3

假设我们在字符串中取一个整数。

字符串s =“ 100”; int i = Integer.parseInt(s); 或int i = Integer.valueOf(s);

但在您的问题中,您要更改的号码是整数

字符串s =“ 10.00”;

double d = Double.parseDouble(s);

int i =(int)d;

这样,您就可以得到想要获得的价值的答案。



2

使用Double.parseDouble(String a)您要查找的内容不是整数,因为它不是整数。


0

还有一种解决方案是可能的。

int number = Integer.parseInt(new DecimalFormat("#").format(decimalNumber))  

例:

Integer.parseInt(new DecimalFormat("#").format(Double.parseDouble("010.021")))  

输出量

10
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.