Answers:
A Double
不是Integer
,因此强制转换将不起作用。请注意Double
类和double
原始类型之间的区别。另请注意,a Double
是a Number
,因此它具有方法 intValue
,您可以使用该方法将值作为原始值获取int
。
intValue()
然后打电话。
intValue()
,它只会将强制转换double
为int
。
您需要使用方法intValue()显式获取int值,如下所示:
Double d = 5.25;
Integer i = d.intValue(); // i becomes 5
要么
double d = 5.25;
int i = (int) d;
2^31 - 1 (Integer.MAX_VALUE)
都会溢出。
1.6 -> 1
,1.4 -> 1
,-1.6 -> -1
,-1.4 -> -1
,
我认为,如果不掩盖陷阱和背后的推理,就不可能理解其他答案。
您不能直接将投射Integer
到Double
对象。也Double
和Integer
是不可变的对象,因此您不能以任何方式修改它们。
每个数字类都有一个原始的替代项(Double
vs double
,Integer
vs 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
。最重要的是,双精度也可以保存“特殊值”,而整数不能:
因此,根据应用程序的不同,您可能希望添加一些过滤以避免讨厌的异常。
然后,下一个缺点是舍入策略。默认情况下,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
另外,不要试图使用new Integer()
构造函数(如其他一些答案所建议的那样)。这些valueOf()
方法更好,因为它们使用缓存。使用这些方法是一个好习惯,因为它们会不时为您节省一些内存。
long rounded = (myDouble == null)? 0L: Math.round(myDouble.doubleValue());
Integer val = new Integer(rounded); // waste of memory
我看到三种可能性。前两个数字被截断,最后一个数字四舍五入到最接近的整数。
double d = 9.5;
int i = (int)d;
//i = 9
Double D = 9.5;
int i = Integer.valueOf(D.intValue());
//i = 9
double d = 9.5;
Long L = Math.round(d);
int i = Integer.valueOf(L.intValue());
//i = 10
确实,最简单的方法是使用intValue()
。但是,这仅返回整数部分。它不做任何舍入。如果要使Integer 最接近 Double值,则需要执行以下操作:
Integer integer = Integer.valueOf((int) Math.round(myDouble)));
并且不要忘记null情况:
Integer integer = myDouble == null ? null : Integer.valueOf((int) Math.round(myDouble)));
Math.round()
相对宽限地处理诸如Infinity和NaN之类的奇怪鸭子情况。
double a = 13.34;
int b = (int) a;
System.out.println(b); //prints 13
Double d = 100.00;
Integer i = d.intValue();
还应该补充一点,它可以与自动装箱一起使用。
否则,您将获得一个int(原始),然后可以从那里获取一个Integer:
Integer i = new Integer(d.intValue());
new Integer(int)
,而使用Integer.valueOf(int)
,它具有一个用于存储小整数(例如此整数)的缓存。
您可以使用“变窄或显式类型转换”,双击→long→int。我希望它能起作用。
double d = 100.04;
long l = (long)d; // Explicit type casting required
int i = (int)l; // Explicit type casting required
PS:它将给出0,因为double具有所有十进制值,而左侧没有任何内容。在0.58的情况下,它会将其范围缩小到0。但是对于其他人,它将起到神奇作用。
试试这个
double doubleValue = 6.5;Double doubleObj = new Double(doubleValue);int intResult = doubleObj.intValue();
对我有用。尝试这个:
double od = Double.parseDouble("1.15");
int oi = (int) od;