我认为如果不覆盖其背后的_539617,就无法理解其他答案 .
您无法直接将 Integer 转换为 Double 对象 . 此外 Double 和 Integer 是不可变对象,因此您无法以任何方式修改它们 .
每个数字 class 都有 primitive 替代( Double vs double , Integer vs int ,...) . 请注意,这些基元以小写字符开头(例如 int ) . 这告诉我们他们没有方法 . 相比之下,类(例如 Integer )就像这些基元周围的盒子/包装器一样,这使得它们可以像对象一样使用它们 .
战略:
要将 Double 转换为 Integer ,您需要遵循以下策略:
将 Double 对象转换为原始 double . (= "unboxing")
将原语 double 转换为原语 int . (= "casting")
将原语 int 转换回 Integer 对象 . (= "boxing")
在代码中:
// starting point
Double myDouble = (10.0);
// step 1: unboxing
double dbl = ();
// step 2: casting
int intgr = (int) dbl;
// step 3: boxing
Integer val = (intgr);
实际上有一条捷径 . 您可以立即从 Double 直接拆箱到原始 int . 这样,您可以完全跳过第2步 .
Double myDouble = (10.0);
Integer val = (()); // the simple way
陷阱:
但是,上面的代码中没有涉及很多内容 . 上面的代码是 not null-safe.
Double myDouble = null;
Integer val = (()); // will throw a NullPointerException
// a null-safe solution:
Integer val = (myDouble == null)? null : (());
现在它适用于大多数值 . 但是,与 Double 相比,整数的范围(最小/最大值)非常小 . 最重要的是,双打也可以保持"special values",整数不能:
1/0 =无穷大
-1/0 = -infinity
0/0 =未定义(NaN)
因此,根据应用程序的不同,您可能需要添加一些过滤以避免令人讨厌的异常 .
然后,下一个缺点是舍入策略 . 默认情况下,Java将始终向下舍入 . 四舍五入在所有编程语言中都非常有意义 . 基本上Java只是丢掉了一些字节 . 在财务应用程序中,您肯定希望使用半向上舍入(例如: round(0.5) = 1 和 round(0.4) = 0 ) .
// null-safe and with better rounding
long rounded = (myDouble == null)? 0L: (());
Integer val = (rounded);
自动 - (联合)拳击
你可能会试图在这里使用auto-(un)boxing,但我现在还没有被卡住,那么接下来的例子也不会那么明显 . 如果你没有_539655使用它 .
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) (10); // doesn't work
Integer val9 = (Integer) 9; // pure nonsense
首选valueOf:
另外,不要试图使用 new Integer() 构造函数(正如其他一些答案所提出的那样) . valueOf() 方法更好,因为它们使用缓存 . 使用这些方法是一个好习惯,因为它们会不时地为你节省一些记忆 .
long rounded = (myDouble == null)? 0L: (());
Integer val = new Integer(rounded); // waste of memory