首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Java中将Double转换为Integer

在Java中将Double转换为Integer
EN

Stack Overflow用户
提问于 2012-02-02 03:53:19
回答 19查看 1M关注 0票数 368

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

它抛出一个异常

"java.lang.ClassCastException: java.lang.Double与java.lang.Integer不兼容“

EN

回答 19

Stack Overflow用户

回答已采纳

发布于 2012-02-02 03:54:14

Double不是Integer,因此强制转换不起作用。请注意Double double 原语之间的区别。还要注意,Double是一个Numberso it has the method intValue,您可以使用它将值作为原语int获取。

票数 487
EN

Stack Overflow用户

发布于 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;
票数 583
EN

Stack Overflow用户

发布于 2014-10-27 22:15:33

我认为,如果不介绍陷阱并对其背后的进行推理,就不可能理解其他答案。

不能将Integer直接转换为Double对象。此外,DoubleInteger是不可变的对象,因此您无法以任何方式修改它们。

每个数值型都有一个原语替代(Double vs doubleInteger vs int,...)。请注意,这些原语以小写字符开头(例如int)。这告诉我们它们不是类/对象。这也意味着他们没有方法。相比之下,类(例如Integer)在这些原语周围的作用就像盒子/包装器,这使得像对象一样使用它们成为可能。

策略:

要将Double转换为Integer,您需要遵循以下策略:

  1. 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

  • -1/0 = -infinity

  • 0/0 =未定义(NaN)

因此,根据应用程序的不同,您可能希望添加一些筛选以避免令人讨厌的异常。

然后,下一个缺点是舍入策略。默认情况下,Java将始终向下舍入。向下舍入在所有编程语言中都很有意义。基本上,Java只是丢弃了一些字节。在金融应用中,你肯定会想要使用半舍五入(例如:round(0.5) = 1round(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

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

首选valueOf:

此外,不要尝试使用new Integer()构造函数(正如其他一些答案所建议的那样)。valueOf()方法更好,因为它们使用缓存。使用这些方法是一个好习惯,因为它们会不时地为您节省一些内存。

long rounded = (myDouble == null)? 0L: Math.round(myDouble.doubleValue());
Integer val = new Integer(rounded); // waste of memory
票数 58
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9102318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档