有办法将java.lang.Double转换为java.lang.Integer吗?

它会抛出一个异常

" . lang。ClassCastException: java.lang.Double不兼容java.lang.Integer"


当前回答

我认为,如果不包括陷阱和背后的推理,就不可能理解其他答案。

不能直接将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对象上调用intValue()。

Double不是Integer,所以强制转换无效。注意Double类和Double原语之间的区别。还要注意,Double是一个数字,因此它有方法intValue,您可以使用该方法获取作为原始int的值。

你需要使用方法intValue()像这样显式地获取int值:

Double d = 5.25;
Integer i = d.intValue(); // i becomes 5

Or

double d = 5.25;
int i = (int) d;

内存效率高,因为它将共享已经创建的Double实例。

Double.valueOf(Math.floor(54644546464/60*60*24*365)).intValue()