有办法将java.lang.Double转换为java.lang.Integer吗?
它会抛出一个异常
" . lang。ClassCastException: java.lang.Double不兼容java.lang.Integer"
有办法将java.lang.Double转换为java.lang.Integer吗?
它会抛出一个异常
" . lang。ClassCastException: java.lang.Double不兼容java.lang.Integer"
当前回答
只需使用Double的intValue方法
Double initialValue = 7.12;
int finalValue = initialValue.intValue();
其他回答
实际上,最简单的方法是使用intValue()。然而,这仅仅返回整数部分;它不做任何舍入。如果你想要最接近Double值的Integer,你需要这样做:
Integer integer = Integer.valueOf((int) Math.round(myDouble)));
不要忘记空大小写:
Integer integer = myDouble == null ? null : Integer.valueOf((int) Math.round(myDouble)));
Math.round()相对优雅地处理奇数鸭子情况,如无穷大和NaN。
我认为,如果不包括陷阱和背后的推理,就不可能理解其他答案。
不能直接将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相比,整数有一个非常小的范围(最小/最大值)。最重要的是,double也可以保存“特殊值”,而整数不能:
1/0 = +∞ -1/0 = -∞ 0/0 = undefined (NaN)
因此,根据应用程序的不同,您可能需要添加一些过滤来避免令人讨厌的异常。
然后,下一个缺点是舍入策略。默认情况下,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)装箱,但我不会。如果你现在已经被困住了,那么接下来的例子也不会那么明显。如果你不理解自动装箱的内部工作原理,那么请不要使用它。
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)
我想下面这些应该没什么好惊讶的。但如果是,那么您可能需要阅读一些关于Java中的类型转换的文章。
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
使用doubleNumber.intValue();方法。
内存效率高,因为它将共享已经创建的Double实例。
Double.valueOf(Math.floor(54644546464/60*60*24*365)).intValue()
Double和Integer分别是Double和int的Java原语的包装类。你可以在它们之间进行类型转换,但是你会失去浮点数。也就是说,将5.4转换为int类型将是5。如果你将它向后转换,它将是5.0。