为了账号安全,请及时绑定邮箱和手机立即绑定

用Java将Double转换为Integer

用Java将Double转换为Integer

神不在的星期二 2019-11-06 11:08:58
任何方式投java.lang.Double来java.lang.Integer?引发异常“ java.lang.ClassCastException:与java.lang.Integer不兼容的java.lang.Double”
查看完整描述

3 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

A Double不是Integer,因此强制转换将不起作用。请注意Double 类和double 原始类型之间的区别。另请注意,a Double是a Number,因此它具有方法 intValue,您可以使用该方法将值作为基元获取int。


查看完整回答
1 反对 回复 2019-11-06
?
12345678_0001

TA贡献1802条经验 获得超5个赞

您需要使用方法intValue()显式获取int值,如下所示:


Double d = 5.25;

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

要么


double d = 5.25;

int i = (int) d;


查看完整回答
反对 回复 2019-11-06
?
胡子哥哥

TA贡献1825条经验 获得超6个赞

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


您不能直接将投射Integer到Double对象。并且Double和Integer是不可变的对象,因此您不能以任何方式修改它们。


每个数字类都有一个原始的替代项(Doublevs double,Integervs int,...)。请注意,这些原语以小写字母(例如int)开头。这就告诉我们它们不是类/对象。这也意味着他们没有方法。相比之下,这些类(例如Integer)的作用就像是围绕这些基元的盒子/包装器,这使得可以像使用对象一样使用它们。


战略:

要将a转换Double为an,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

陷阱:

但是,上面的代码中没有很多内容。上面的代码不是null安全的。


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());

现在,它适用于大多数值。但是,与a相比,整数的范围(最小值/最大值)非常小Double。最重要的是,双精度也可以保存“特殊值”,而整数不能:


1/0 = +无穷大

-1/0 =-无穷大

0/0 =未定义(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);

自动装箱

您可能会在此使用自动装箱,但我不会。如果您现在已经陷入困境,那么接下来的例子也不会那么明显。如果您不了解自动装箱的内部工作原理,请不要使用它。


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


查看完整回答
反对 回复 2019-11-06
  • 3 回答
  • 0 关注
  • 22951 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信