首页 文章

在Java中将Double转换为Integer

提问于
浏览
301

有什么方法可以将 java.lang.Double 转换为 java.lang.Integer

它引发了一个例外

“java.lang.ClassCastException:java.lang.Double与java.lang.Integer不兼容”

17 回答

  • 0

    使用 doubleNumber.intValue(); 方法 .

  • -2

    它对我有用 . 试试这个:

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

    Double 对象上调用 intValue() .

  • 6

    Double 不是 Integer ,因此演员阵容无效 . 注意 Double classdouble primitive 之间的区别 . 另请注意 DoubleNumberso it has the method intValue ,您可以使用它来获取原始值 int .

  • 3

    我认为如果不覆盖其背后的_539617,就无法理解其他答案 .

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

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

    战略:

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

    • Double 对象转换为原始 double . (= "unboxing")

    • 将原语 double 转换为原语 int . (= "casting")

    • 将原语 int 转换回 Integer 对象 . (= "boxing")

    在代码中:

    // 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
    

    陷阱:

    但是,上面的代码中没有涉及很多内容 . 上面的代码是 not null-safe.

    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 相比,整数的范围(最小/最大值)非常小 . 最重要的是,双打也可以保持"special values",整数不能:

    • 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);
    

    自动 - (联合)拳击

    你可能会试图在这里使用auto-(un)boxing,但我现在还没有被卡住,那么接下来的例子也不会那么明显 . 如果你没有_539655使用它 .

    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
    

    首选valueOf:

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

    long rounded = (myDouble == null)? 0L: Math.round(myDouble.doubleValue());
    Integer val = new Integer(rounded); // waste of memory
    
  • 2

    Double和Integer分别是double和int的Java原语的包装类 . 你可以在这些之间施放,但你将失去浮点 . 也就是说,转换为int的5.4将是5.如果你将它转换回来,它将是5.0 .

  • 504
    double a = 13.34;
    int b = (int) a;
    
    System.out.println(b); //prints 13
    
  • 13
    Double d = 100.00;
    Integer i = d.intValue();
    

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

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

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

    实际上,最简单的方法是使用 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,相对优雅 .

  • 38

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

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

    要么

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

    只需使用Double的intValue方法即可

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

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

    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
    
  • 0

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

    Double d = 13.5578;
    int i = d.intValue();
    System.out.println(i);
    
  • 37

    像这样:

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

    你可以通过使用“Narrowing or Explicit type conversion”,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.但对于其他人来说它会做出魔力 .

  • 408

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

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

    试试这个

    double doubleValue = 6.5;Double doubleObj = new Double(doubleValue);int intResult = doubleObj.intValue();
    

相关问题