在Java中将Double转换为Integer

4le*_*x1v 337 java casting

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

它引发了一个例外

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

anu*_*ava 552

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

Double d = 5.25;
Integer i = d.intValue(); // i becomes 5
Run Code Online (Sandbox Code Playgroud)

要么

double d = 5.25;
int i = (int) d;
Run Code Online (Sandbox Code Playgroud)

  • 谢谢.非常清楚.对我来说,接受的答案就像是在问一个愚蠢的问题.但你的答案非常慷慨. (65认同)
  • 任何双值>`2 ^ 31 - 1(Integer.MAX_VALUE)`都会溢出. (5认同)
  • 并且,顺便说一句,当从double转换为int时,它只保留整数部分,对于正数和负数,并且不关心舍入.例如`1.6 - > 1`,`1.4 - > 1`,`-1.6 - > -1`,`-1.4 - > -1`, (3认同)
  • 当double值超出整数范围时会发生什么?(比如2 ^ 33) (2认同)

hvg*_*des 446

A Double不是Integer,所以演员不会工作.注意Double double 基元之间的区别.另请注意a Double是a Number,因此它具有方法 intValue,您可以使用该方法将值作为基元获取int.

  • 然后调用`intValue()`. (176认同)
  • 请注意,这只返回Double的整数部分,因此对于13.666667甚至13.9,您将获得13而不是14.如果您想要_nearest_整数,请参阅我的答案:http://stackoverflow.com/a/一百四十五万〇二百九十四分之二千四百八十一万六千三百三十六 (13认同)
  • 不要忘记处理空值. (6认同)
  • 好的不要施展.我需要从Double获取Integer对象,而不是13.22222但是13. (2认同)
  • 如果你看一下`intValue()`的实现,它只是将`double`强制转换为`int`. (2认同)

bvd*_*vdb 46

我认为,如果不解决其背后的陷阱和推理,就无法理解其他答案.

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

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

战略:

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

  1. Double对象转换为基元double.(="取消装箱")
  2. 将基元转换为基doubleint.(="铸造")
  3. 将基元转换intInteger对象.(="拳击")

在代码中:

// 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);
Run Code Online (Sandbox Code Playgroud)

实际上有一条捷径.您可以立即从Double直接拆分到基元int.这样,您可以完全跳过第2步.

Double myDouble = Double.valueOf(10.0);
Integer val = Integer.valueOf(myDouble.intValue()); // the simple way
Run Code Online (Sandbox Code Playgroud)

陷阱:

但是,上面的代码中没有涉及很多内容.上面的代码不是空的安全.

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());
Run Code Online (Sandbox Code Playgroud)

现在它适用于大多数值.然而,与a相比,整数具有非常小的范围(最小/最大值)Double.最重要的是,双打也可以保持"特殊值",整数不能:

  • 1/0 = +无穷大
  • -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);
Run Code Online (Sandbox Code Playgroud)

自动(UN)拳击

你可能想在这里使用自动(非)拳击,但我不会.如果你现在已经陷入困境,那么下一个例子也不会那么明显.如果您不了解自动(非)拳击的内部工作原因,请不要使用它.

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)
Run Code Online (Sandbox Code Playgroud)

我想以下不应该是一个惊喜.但如果是,那么你可能想阅读一些关于Java中的转换的文章.

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

首选valueOf:

另外,不要试图使用new Integer()构造函数(正如其他一些答案所提出的那样).这些valueOf()方法更好,因为它们使用缓存.使用这些方法是一个好习惯,因为它们会不时地为你节省一些记忆.

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


小智 37

我看到三种可能性.前两个截断数字,最后一个截止到最接近的整数.

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
Run Code Online (Sandbox Code Playgroud)

  • 如果要将结果存储在primitieve int中,则不需要Integer.valueOf.您的代码强制Java执行不必要的框和取消框. (21认同)

Ric*_*rtz 22

像这样:

Double foo = 123.456;
Integer bar = foo.intValue();
Run Code Online (Sandbox Code Playgroud)


Mic*_*per 22

实际上,最简单的方法是使用intValue().但是,这只返回整数部分; 它没有做任何舍入.如果你想要最接近 Double值的Integer ,你需要这样做:

Integer integer = Integer.valueOf((int) Math.round(myDouble)));
Run Code Online (Sandbox Code Playgroud)

并且不要忘记空案例:

Integer integer = myDouble == null ? null : Integer.valueOf((int) Math.round(myDouble)));
Run Code Online (Sandbox Code Playgroud)

Math.round() 处理奇怪的鸭子情况,如无限和NaN,相对优雅.

  • 如果将Math.round结果转换为int,为什么还需要Integer.valueOf? (2认同)

小智 13

double a = 13.34;
int b = (int) a;

System.out.println(b); //prints 13
Run Code Online (Sandbox Code Playgroud)

  • 问题是关于包装类的.这个答案是关于原始的. (2认同)

Sun*_*rma 7

简单地这样做......

Double d = 13.5578;
int i = d.intValue();
System.out.println(i);
Run Code Online (Sandbox Code Playgroud)


man*_*_ak 6

Double d = 100.00;
Integer i = d.intValue();
Run Code Online (Sandbox Code Playgroud)

还应该补充一点,它适用于自动装箱.

否则,你得到一个int(原始),然后从那里得到一个Integer:

Integer i = new Integer(d.intValue());
Run Code Online (Sandbox Code Playgroud)

  • 不要使用`new Integer(int)`,而要使用`Integer.valueOf(int)`,它具有一个小整数的缓存,例如这个整数。 (2认同)

Ale*_*huk 5

打电话intValue()给你的Double对象.

  • 似乎重复了之前的答案。 (2认同)