如何在Java中将double转换为int并向下取整?

91

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


可能是如何在Java中将浮点数转换为整数的重复问题。 - Ciro Santilli OurBigBook.com
我相信在Java中,浮点数(float)和双精度浮点数(double)是不同的数据类型。 - badpanda
我认为它们太接近了,因为两者都是原始类型和浮点类型。答案相同,并且很可能会继续保持这样。 - Ciro Santilli OurBigBook.com
1
实际上,浮点数问题更准确地询问如何按照某些未指定的舍入标准舍入浮点数。这个问题可能更适当地改名为“如何在Java中将double向零舍入并转换为int?”与询问如何对double进行下取整类似,但是下取整是向负无穷大舍入而不是向零舍入。尽管问题的标题相似,但答案却非常不同。 - badpanda
9个回答

148
将一个值强制转换成int类型会自动删除小数点后的部分。不需要调用Math.floor()函数(假设数字是正数)。
只需使用(int)进行强制转换,例如:
System.out.println((int)(99.9999)); // Prints 99

话虽如此,它与Math.floor的行为不同,后者向负无穷大舍入(@Chris Wong)


28
请注意,Math.floor 对负数的处理结果与简单的类型转换不同。 - Joey
4
这取决于原帖中“round down”的意思。强制类型转换将其“向零舍入”,而Math.floor则向负无穷大舍入。 - Lambda Fairy
5
请注意,int类型无法表示double类型能够表示的所有整数值。如果您希望截断双精度值,则应将其转换为64位整数类型long。System.out.println((long)(9.9999e300)); - Monroe Thomas
2
虽然IEEE 754 rounding rules使用“截断”一词表示向零舍入,并使用“向下取整”和“floor”这两个同义词表示向负无穷大舍入,但Java的BigDecimalRoundingMode类将ROUND_DOWN用于向零舍入,将ROUND_FLOOR用于向负无穷大舍入。 - Andreas

34

将一个double转换为int并使其四舍五入到最接近的整数(即与典型的(int)(1.8)(int)(1.2)不同,它们都会向0“向下取整”并返回1),只需将0.5添加到您要强制转换为int的double值中

例如,如果我们有

double a = 1.2;
double b = 1.8;

接下来针对 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

但是通过对每个数加上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

作为一个小注释,这种方法还允许您控制在进行(int)强制类型转换时舍入double的阈值。

(int)(a + 0.8);

进行类型转换。只有当小数值大于或等于0.2时,才会将其四舍五入为(int)a + 1。也就是说,在类型转换之前立即将0.8添加到double上,10.15和10.03在(int)类型转换时将被舍弃为10,但10.23和10.7将会被四舍五入为11。


6
你说得完全正确,这确实没有用。我发现当谷歌搜索"Java int typecast double"时,会出现这个主题贴,认为需要此功能的某人可以使用这种方法直接将数字四舍五入或向下取整(int类型转换)。我并没有使用stackoverflow账户发布这篇文章(所以我并不想在这里提高我的声望,如果这是被认真对待的话),只是想帮忙传播一个我经常使用的有用技巧。 :) 干杯! - JavaDrip
4
不错,但请记住这只适用于正数。比如说,如果你用这个技巧来舍入-0.8,那么代码System.out.println(""+ (int)(-0.8d + 0.5))会输出0,而不是预期的-1。 - Gil Vegliach

19

(int)99.99999

这将会是99。 将一个double转换为int并不会四舍五入,它会丢弃小数部分。


如果是-99.99999.9,它将会四舍五入。 - Hagai Harari

13
Math.floor(n)

其中n是一个双精度浮点数。似乎这会返回一个双精度浮点数,所以确保在之后进行类型转换。


2
不需要在转换之前进行取整,可以参考Xorlev的答案。 - Mizipzor
6
@Miz: 负数的语义是不同的。 - Joey

5

new Double(99.9999).intValue()


5

这个代码可以正常工作 int i = (int) dbl;


1
尝试使用这个,这很简单。
double x= 20.22889909008;
int a = (int) x;

this will return a=20

或者尝试使用这个:
Double x = 20.22889909008;
Integer a = x.intValue();

this will return a=20

或者尝试使用以下内容:
double x= 20.22889909008;
System.out.println("===="+(int)x);

this will return ===20

也许这些代码能帮到您。

0
在这个问题中:
1.将double转换为整数非常容易。
2.但它不能将double值四舍五入到最近的小数位。因此,可以像这样进行强制转换:
double d=99.99999999;
int i=(int)d;
System.out.println(i);

它将打印99,但尚未进行四舍五入。

因此,我们可以使用以下方法进行四舍五入:

double d=99.99999999;
System.out.println( Math.round(d));

这将打印出100的输出。


0

尝试使用 Math.floor。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接