如何用Java将Double类型转为Integer?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (10)
  • 关注 (0)
  • 查看 (55)

有没有方法可以使转换java.lang.Doublejava.lang.Integer吗?

异常

"java.lang.ClassCastException: java.lang.Double incompatible with java.lang.Integer"

提问于
用户回答回答于

Double和Integer类型不一致所以出错。注意Double和原始的double也不同,Dounle是一个Number型,所以它存在方法intValue,你可以使用它获得int类型的值

用户回答回答于

可以这样做

Double d = 13.5578;
int i = d.intValue();
System.out.println(i);
用户回答回答于
用户回答回答于
Double d = 100.00;
Integer i = d.intValue();

它适用于自动装箱。

否则,你将得到一个int(原始类型),然后可以从那里获得一个Integer:

Integer i = new Integer(d.intValue());
用户回答回答于
double a = 13.34;
int b = (int) a;

System.out.println(b); //prints 13
用户回答回答于

事实上,最简单的方法就是使用intValue()然而,这只是返回整数部分;它不执行任何舍入操作。如果你想要最接近Double的值,可以这样做:

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

别忘了空值的情况:

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

Math.round()在处理空值和无穷大的效果比较好。

用户回答回答于

就像这样:

Double foo = 123.456;
Integer bar = foo.intValue();
用户回答回答于

可以去了解一下它的底层实现

不能直接将整数类型转换为Double类型。另外,Double和Integer是不可变的对象,所以你不能修改它们。但是,每个数值型类都有一个原始类型 (Double vs double,Integer vs int)。

所以可以这样做:

  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类型。

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=未定义(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

还可以这样强制转换。

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
用户回答回答于

下面是3种方法,前两个直接获取整数部分,最后一个获取最接近的整数(四舍五入)

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()方法获得int值,如下所示:

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

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

扫码关注云+社区