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

它会抛出一个异常

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


Double不是Integer,所以强制转换无效。注意Double类和Double原语之间的区别。还要注意,Double是一个数字,因此它有方法intValue,您可以使用该方法获取作为原始int的值。


你需要使用方法intValue()像这样显式地获取int值:

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

Or

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

Double和Integer分别是Double和int的Java原语的包装类。你可以在它们之间进行类型转换,但是你会失去浮点数。也就是说,将5.4转换为int类型将是5。如果你将它向后转换,它将是5.0。


是这样的:

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

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

System.out.println(b); //prints 13

我认为有三种可能。前两个截断数字,最后一个舍入到最近的整数。

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

Double d = 100.00;
Integer i = d.intValue();

还应该补充一点,它与自动装箱一起工作。

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

Integer i = new Integer(d.intValue());

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

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

不要忘记空大小写:

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

Math.round()相对优雅地处理奇数鸭子情况,如无穷大和NaN。


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

不能直接将Integer类型转换为Double类型对象。此外,Double和Integer是不可变对象,因此不能以任何方式修改它们。

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

策略:

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

陷阱:

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

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相比,整数有一个非常小的范围(最小/最大值)。最重要的是,double也可以保存“特殊值”,而整数不能:

1/0 = +∞ -1/0 = -∞ 0/0 = undefined (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);

博兴县Auto -(一)

您可能会想在这里使用自动(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)

我想下面这些应该没什么好惊讶的。但如果是,那么您可能需要阅读一些关于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 = 13.5578;
int i = d.intValue();
System.out.println(i);

使用doubleNumber.intValue();方法。


只需使用Double的intValue方法

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

你可以使用“缩小或显式类型转换”来做到这一点, 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 doubleValue = 6.5;Double doubleObj = new Double(doubleValue);int intResult = doubleObj.intValue();

这对我很有效。试试这个:

double od = Double.parseDouble("1.15");
int oi = (int) od;

内存效率高,因为它将共享已经创建的Double实例。

Double.valueOf(Math.floor(54644546464/60*60*24*365)).intValue()

或者,可以先转换为原语double,然后转换为int,让它自动装箱为Integer。

Double d = 20.3;
Integer i = (int) (double) d; //20
//To obtain primitive:
int i2 = (int) (double) d;

首先你应该用双份而不是双份。

例子

int intResult = newDoubleObj.intValue();