有没有办法将java.lang.Double
转换为java.lang.Integer
?
它会抛出一个异常
"java.lang.ClassCastException: java.lang.Double不兼容于java.lang.Integer"
你需要使用方法intValue()显式地获取int值,就像这样:
Double d = 5.25;
Integer i = d.intValue(); // i becomes 5
或者double d = 5.25;
int i = (int) d;
Double
不是一个Integer
,所以强制转换是无法工作的。注意Double
类和double
原始类型之间的区别。还要注意Double
是一个Number
,所以它有方法intValue
,你可以使用它将值作为原始int
获取。
Integer
转换为Double
对象。此外,Double
和Integer
是不可变对象,因此您无法以任何方式修改它们。Double
vs double
, Integer
vs int
, ...)。请注意,这些基本类型以小写字符开头(例如int
),这告诉我们它们不是类/对象。这也意味着它们没有方法。相比之下,类(例如Integer
)就像围绕这些基本类型的盒子/包装器,这使得可以像使用对象一样使用它们。
Double
转换为Integer
,您需要遵循以下策略:
Double
对象转换为基本类型double
。(=“拆箱”)double
转换为基本类型int
。(=“强制类型转换”)int
再次转换为Integer
对象。(=“装箱”)// starting point
Double myDouble = Double.valueOf(10.0);
// step 1: unboxing
double dbl = myDouble.doubleValue();
// step 2: casting
int intgr = (int) dbl;
// step 3: boxing
Integer val = Integer.valueOf(intgr);
实际上有一种捷径。您可以直接将Double
转换为原始的int
,这样就可以完全跳过第2步。
Double myDouble = Double.valueOf(10.0);
Integer val = Integer.valueOf(myDouble.intValue()); // the simple way
然而,上述代码并未涵盖所有情况。 上述代码不具备空值安全性。
Double myDouble = null;
Integer val = Integer.valueOf(myDouble.intValue()); // will throw a NullPointerException
// a null-safe solution:
Integer val = (myDouble == null)? null : Integer.valueOf(myDouble.intValue());
Double
相比,整数的范围非常小(最小/最大值)。此外,双精度浮点数还可以保存整数不行的“特殊值”:
round(0.5) = 1
和round(0.4) = 0
)。// null-safe and with better rounding
long rounded = (myDouble == null)? 0L: Math.round(myDouble.doubleValue());
Integer val = Integer.valueOf(rounded);
在这里,你可能会被诱惑使用自动装箱和拆箱,但我不建议这样做。如果你现在已经遇到了问题,那么下面的例子也不会更加明显。如果你不理解自动装箱和拆箱的内部机制,请不要使用它。
Integer val1 = 10; // works
Integer val2 = 10.0; // doesn't work
Double val3 = 10; // doesn't work
Double val4 = 10.0; // works
Double val5 = null;
double val6 = val5; // doesn't work (throws a NullPointerException)
double val7 = (double) 10; // works
Double val8 = (Double) Integer.valueOf(10); // doesn't work
Integer val9 = (Integer) 9; // pure nonsense
同时,不要被一些其他答案所提出的使用new Integer()
构造器所诱惑。因为valueOf()
方法使用缓存,所以它们更好。使用这些方法是一个好习惯,因为有时它们会节省一些内存。
long rounded = (myDouble == null)? 0L: Math.round(myDouble.doubleValue());
Integer val = new Integer(rounded); // waste of memory
我看到三种可能性。前两种会截去数字,最后一种会四舍五入到最近的整数。
double d = 9.5;
int i = (int)d;
//i = 9
Double D = 9.5;
int i = Integer.valueOf(D.intValue());
//i = 9
double d = 9.5;
Long L = Math.round(d);
int i = Integer.valueOf(L.intValue());
//i = 10
事实上,最简单的方法是使用intValue()
。但是,这只返回整数部分,不进行任何取整。如果您想要最接近Double值的整数,则需要执行以下操作:
Integer integer = Integer.valueOf((int) Math.round(myDouble)));
不要忘记空值情况:
Integer integer = myDouble == null ? null : Integer.valueOf((int) Math.round(myDouble)));
Math.round()
可以相对优雅地处理无穷大和NaN等异常情况。
就像这样:
Double foo = 123.456;
Integer bar = foo.intValue();
double a = 13.34;
int b = (int) a;
System.out.println(b); //prints 13
只需按照以下方式操作...
Double d = 13.5578;
int i = d.intValue();
System.out.println(i);
Double d = 100.00;
Integer i = d.intValue();
需要补充的是它支持自动装箱。
否则,你会得到一个int(原始类型),然后可以从中获取一个Integer:
Integer i = new Integer(d.intValue());
new Integer(int)
,而应该使用Integer.valueOf(int)
,它针对小整数(如此)有缓存。 - bvdb在你的Double
对象上调用intValue()
方法。
intValue()
即可。 - hvgotcodesintValue()
的实现,它只是将double
强制转换为int
。 - carlo.marinangeli