近视的春卷 · mongodb://10.79.12.56: ...· 4 月前 · |
鼻子大的生姜 · java - Unrecognized ...· 1 年前 · |
另类的杨桃 · pandas ...· 1 年前 · |
还单身的苦瓜 · flink-cdc同步mysql数据到kaf ...· 1 年前 · |
爱健身的芒果 · mysql根据json字段的内容检索查询数据 ...· 1 年前 · |
有没有办法将
java.lang.Double
转换为
java.lang.Integer
?
它抛出一个异常
"java.lang.ClassCastException: java.lang.Double与java.lang.Integer不兼容“
发布于 2012-02-02 03:54:14
Double
不是
Integer
,因此强制转换不起作用。请注意
Double
类
和
double
原语
之间的区别。还要注意,
Double
是一个
Number
,
so it has the method
intValue
,您可以使用它将值作为原语
int
获取。
发布于 2012-02-02 03:56:29
您需要使用intValue()方法显式获取int值,如下所示:
Double d = 5.25;
Integer i = d.intValue(); // i becomes 5
或
double d = 5.25;
int i = (int) d;
发布于 2014-10-27 22:15:33
我认为,如果不介绍 陷阱并对其背后的 进行推理,就不可能理解其他答案。
不能将
Integer
直接转换为
Double
对象。此外,
Double
和
Integer
是不可变的对象,因此您无法以任何方式修改它们。
每个数值型
类
都有一个
原语
替代(
Double
vs
double
,
Integer
vs
int
,...)。请注意,这些原语以小写字符开头(例如
int
)。这告诉我们它们不是类/对象。这也意味着他们没有方法。相比之下,类(例如
Integer
)在这些原语周围的作用就像盒子/包装器,这使得像对象一样使用它们成为可能。
策略:
要将
Double
转换为
Integer
,您需要遵循以下策略:
Double
对象转换为基元
double
。(=将原始
double
转换为原始
int
。(=将基元
int
返回到
Integer
对象。(= "boxing")
在代码中:
// 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
陷阱:
然而,上面的代码中没有涵盖很多东西。上面的代码是 not null-safe。
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
相比,整数的范围(最小/最大值)非常小。最重要的是,doubles还可以保存整数不能保存的“特殊值”:
未定义1/0= +infinity
因此,根据应用程序的不同,您可能希望添加一些筛选以避免令人讨厌的异常。
然后,下一个缺点是舍入策略。默认情况下,Java将始终向下舍入。向下舍入在所有编程语言中都很有意义。基本上,Java只是丢弃了一些字节。在金融应用中,你肯定会想要使用半舍五入(例如:
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);
自动(取消)装箱
你可能很想在本文中使用 auto-(un)boxing ,但我不会,如果你现在已经被卡住了,那么下面的例子也不会那么明显。如果您不了解自动(取消)装箱的内部工作原理,请不要使用它。
Integer val1 = 10; // works
Integer val2 = 10.0; // doesn't work
Double val3 = 10; // doesn't work
Double val4 = 10.0; // works