在Java中将Double转换为整数

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

它会抛出一个异常

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

1063817 次浏览

Double不是Integer,因此转换无效。注意Double double 原始的之间的区别。还要注意,DoubleNumberInteger0 intValue,你可以用它来获取原语int的值。

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

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

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()。然而,这仅仅返回整数部分;它不做任何舍入。如果你想要Integer 最近的为Double值,你需要这样做:

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

不要忘记空大小写:

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

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

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

不能直接将Integer对象强制转换为Double对象。而且DoubleInteger是不可变对象,所以你不能以任何方式修改它们。

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

策略:

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

  1. Double对象转换为原语double。(=“仅”)
  2. 将原语double转换为原语int。(=“铸造”)
  3. 将原语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) = 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 (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;

首先你应该使用Double而不是double

例子

int intResult = newDoubleObj.intValue();