任何方式投java.lang.Double来java.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)
hvg*_*des 446
A Double不是Integer,所以演员不会工作.注意Double 类和double 基元之间的区别.另请注意a Double是a Number,因此它具有方法 intValue,您可以使用该方法将值作为基元获取int.
bvd*_*vdb 46
我认为,如果不解决其背后的陷阱和推理,就无法理解其他答案.
您无法直接Integer转换为Double对象.此外Double,Integer它们是不可变对象,因此您无法以任何方式修改它们.
每个数字类都有一个原始替代(Doublevs double,Integervs int,...).请注意,这些基元以小写字符开头(例如int).这告诉我们它们不是类/对象.这也意味着他们没有方法.相比之下,类(例如Integer)就像这些基元周围的盒子/包装器一样,这使得它们可以像对象一样使用它们.
要将a转换为a 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);
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.最重要的是,双打也可以保持"特殊值",整数不能:
因此,根据应用程序的不同,您可能需要添加一些过滤以避免令人讨厌的异常.
然后,下一个缺点是舍入策略.默认情况下,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);
Run Code Online (Sandbox Code Playgroud)
你可能想在这里使用自动(非)拳击,但我不会.如果你现在已经陷入困境,那么下一个例子也不会那么明显.如果您不了解自动(非)拳击的内部工作原因,请不要使用它.
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)
另外,不要试图使用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)
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,相对优雅.
小智 13
double a = 13.34;
int b = (int) a;
System.out.println(b); //prints 13
Run Code Online (Sandbox Code Playgroud)
简单地这样做......
Double d = 13.5578;
int i = d.intValue();
System.out.println(i);
Run Code Online (Sandbox Code Playgroud)
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)
| 归档时间: |
|
| 查看次数: |
985276 次 |
| 最近记录: |