在Java中将Double转换为Integer

任何方式来投射java.lang.Doublejava.lang.Integer

它引发一个exception

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

Double不是一个Integer ,所以演员阵容不会工作。 注意Double double 基元之间的区别。 还要注意Double是一个Number , 所以它有 intValue 方法 ,当你可以用来获得一个基本的int

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

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

要么

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

我看到三种可能性。 前两个数字被切断,最后一个数字到最近的整数。

 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 

我认为不可能理解其他答案,而不能覆盖其背后的陷阱和推理。

您不能直接将Integer转换为Double对象。 Double和Integer也是不可变的对象,所以你不能以任何方式修改它们。 然而,每个数字类有一个原始的替代(双与双,整数与整数,…)。

所以这个策略应该是

  1. 将Double对象转换为原始的double对象。 (=“拆箱”)
  2. 将原语double转换为原始的int。 (=“铸造”)
  3. 将原始整数转换回Integer对象。 (=“拳击”)

在Java中:

 // 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相比,整数的范围非常小(最小值/最大值)。 最重要的是,双打还可以拥有“特殊的价值”,整数不能:

  • 1/0 = +无穷大
  • -1/0 = -infinity
  • 0/0 =未定义(NaN)

因此,根据应用程序的不同,您可能需要添加一些过滤来避免恶意的exception。

那么下一个缺点就是舍入策略。 默认情况下,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); 

你可能会被诱惑使用自动(联合)拳击,但我不会。 如果你现在已经被卡住了,那么接下来的事情也不会那么明显。 如果你不了解自动(非)拳击的内部工作,那么请不要使用它。

 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 

我想下面应该不会是一个惊喜。 但如果是这样,那么你可能想阅读一些关于在Java中投射的文章。

 double val7 = (double) 10; // works Double val8 = (Double) Integer.valueOf(10); // doesn't work Integer val9 = (Integer) 9; // pure nonsense 

此外,不要试图使用new Integer()构造函数(如其他一些答案)。 valueOf()方法更好,因为它们使用caching。 使用这些方法是一个好习惯,因为他们会不时地为你节省一些记忆。

 long rounded = (myDouble == null)? 0L: Math.round(myDouble.doubleValue()); Integer val = new Integer(rounded); // waste of memory 

喜欢这个:

 Double foo = 123.456; Integer bar = foo.intValue(); 

的确,最简单的方法是使用intValue() 。 但是,这只是返回整数部分; 它不做任何舍入。 如果你想整数 Double值最近 ,你需要这样做:

 Integer integer = Integer.valueOf((int) Math.round(myDouble))); 

不要忘记空的情况下:

 Integer integer = myDouble == null ? null : Integer.valueOf((int) Math.round(myDouble))); 

Math.round()处理奇怪的鸭子情况,如无穷大和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 i = new Integer(d.intValue()); 

Double对象上调用intValue()

只要这样做…

 Double d = 13.5578; int i = d.intValue(); System.out.println(i); 

Double和Integer分别是用于double和int的Java基元的包装类。 你可以在这些之间施放,但是你会失去浮点。 也就是说,5.4对一个int的铸造将是5.如果你把它扔回去,它将会是5.0。

您可以使用“缩小或显式types转换”,double→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的intValue方法即可

 Double initialValue = 7.12; int finalValue = initialValue.intValue(); 

使用doubleNumber.intValue(); 方法。

试试这个

double doubleValue = 6.5; Double doubleObj = new Double(doubleValue); int intResult = doubleObj.intValue();