如何通过舍入来将Java中的double转换为int?

bad*_*nda 71 java casting

我需要在Java中将double转换为int,但数值必须始终向下舍入.即99.99999999 - > 99

Xor*_*lev 134

转换为int会隐式删除任何小数.无需调用Math.floor()(假设为正数)

只需使用(int)进行类型转换,例如:

System.out.println((int)(99.9999)); // Prints 99
Run Code Online (Sandbox Code Playgroud)

Math.floor就是说,它确实有一种不同的行为,从而朝向负无穷大(@Chris Wong)

  • 请注意,`Math.floor`*确实*为负数产生不同于简单类型转换的结果. (26认同)
  • 另请注意,int不能表示double可以使用的所有可能的整数值.如果要截断双精度值,则转换为64位整数值,如long.`的System.out.println((长)(9.9999e300));` (5认同)
  • 这取决于OP的意思是"向下舍入".演员将其向下"向下"向零,而Math.floor向负向无穷大四舍五入. (3认同)
  • 尽管 IEEE 754 [舍入规则](https://en.wikipedia.org/wiki/IEEE_floating_point#Rounding_rules) 使用术语 *truncation* 表示向零舍入,并使用同义词术语 *round down* 和 *floor*对于向负无穷大舍入,Java 的 [`BigDecimal`](https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html#field.summary) 和 [`RoundingMode `](https://docs.oracle.com/javase/8/docs/api/java/math/RoundingMode.html#enum.constant.summary) 类使用“ROUND_DOWN”向零舍入和“ROUND_FLOOR”用于向负无穷大舍入。 (2认同)

Jav*_*rip 31

蒙上了双为int,并把它四舍五入到最接近的整数(即不同于典型的(int)(1.8)(int)(1.2),这都将"四舍五入"向0和返回1),只需添加0.5到double你将强制转换为一个int.

例如,如果我们有

double a = 1.2;
double b = 1.8;
Run Code Online (Sandbox Code Playgroud)

然后x和y的以下类型转换表达式将返回向下舍入的值(x = 1y = 1):

int x = (int)(a);   // This equals (int)(1.2) --> 1
int y = (int)(b);   // This equals (int)(1.8) --> 1
Run Code Online (Sandbox Code Playgroud)

但是通过向每个添加0.5,我们将获得在某些情况下(和)我们可能需要的舍入到最接近整数的结果:x = 1y = 2

int x = (int)(a + 0.5);   // This equals (int)(1.8) --> 1
int y = (int)(b + 0.5);   // This equals (int)(2.3) --> 2
Run Code Online (Sandbox Code Playgroud)

作为一个小纸条,这种方法也可以让你控制的阈值,在其double被四舍五入后(int)类型转换.

(int)(a + 0.8);
Run Code Online (Sandbox Code Playgroud)

转向.只有(int)a + 1当十进制值大于或等于0.2时,才会向上舍入.也就是说,通过double在类型转换之前加上0.8,在类型转换时10.15和10.03将向下舍入到10 (int),但10.23和10.7将向上舍入到11.

  • 你完全正确,但事实并非如此.我看到当谷歌为"Java int typecast double"时出现这个线程,并且认为有人正在寻找一种直接使用(int)类型转换向上/向下舍入的方法可以使用它.这不是使用stackoverflow帐户发布的(所以我不是想提高我的声誉,如果在这里认真对待),只是试图传播我经常使用的一个很酷的技巧.:)干杯! (6认同)
  • 很好,但请记住这只适用于**正**双打.例如,如果你用这个技巧将-0.8舍入,那么代码`System.out.println(""+(int)( - 0.8d + 0.5))`打印0,而不是-1按预期 (4认同)

lee*_*roy 17

(INT)99.99999

将是99.将一个double转换为int不会舍入,它将丢弃小数部分.


Aus*_*ick 11

Math.floor(n)
Run Code Online (Sandbox Code Playgroud)

其中n是双精度数.这似乎实际上会返回一个双倍,所以请确保你之后进行类型转换.

  • @miz:但负数的语义不同. (6认同)
  • 不需要在演员阵容之前,请参阅Xorlev的回答. (2认同)

fas*_*ava 5

这很好用 int i = (int) dbl;


Nic*_*o.S 5

new Double(99.9999).intValue()