Java 理解整除

Java 理解整除,java,casting,integer-division,Java,Casting,Integer Division,我有以下代码: public static final long KILOMETER_IN_METERS = 1000; public static int getKilometers(int distanceInMeter) { return (int) Math.floor(distanceInMeter / KILOMETER_IN_METERS); } 对于带有返回语句的行,Sonar说: Integral division result cast to double or

我有以下代码:

public static final long KILOMETER_IN_METERS = 1000;

public static int getKilometers(int distanceInMeter) {
    return (int) Math.floor(distanceInMeter / KILOMETER_IN_METERS);
}
对于带有返回语句的行,Sonar说:

Integral division result cast to double or float 整除结果转换为双精度或浮点


据我所知,它说有一个int/int除法,其结果可能是一个浮点值,但我可能错了。

我怎样才能正确处理这个案子

这里不需要使用
Math.floor
Math.floor
是对
double
的操作,当您向其提供int时,它不会执行任何操作

返回最大值(最接近正无穷大)
double
小于或等于参数的值 等于一个数学整数。特殊情况:
  • 如果 参数值已等于数学整数,则 结果与参数相同。
  • 如果参数为 NaN或无穷大或正零或负零 结果与参数相同。

()

整数除法已经具有与
Math.floor
相同的逻辑行为,即它截断除法运算的剩余部分
int/int
始终返回一个
int

例如,
100/3
将返回
33
40/50
将返回
0

只需使用以下代码:

public static int getKilometers(int distanceInMeter) {
    return distanceInMeter / KILOMETER_IN_METERS;
}

这是因为
Math.floor
将double作为参数,整数除以整数已经是整数了。所以所有的施放声纳都是在那里完成的,而不是显式施放到
int


下面是关于
地板的文档

要扩展Eran的答案,下面是您正在做的:

distanceInMeter/km\u IN_米
将一个整数除以一个整数。在Java中,该结果是一个截断的整数。然后你把它放到Math.floor中,需要一个双精度。因此,Java试图帮助您,将
int
转换为
double
。然后将
Math.floor
返回的
double
转换回
int

如果您一直在跟踪,您可能已经注意到您已经有了截断的int。因此,您的代码需要简单:

public static int getKilometers(int distanceInMeter) {
    return distanceInMeter / KILOMETER_IN_METERS;
}

当你除以两个整数时,你总是会得到一个向下舍入的整数。 如果将
distanceInMeter/km\u除以inu-METERS
,然后将其分配给一个double,则在分配之前,首先将其划分为
int
eger,这样您将得到一个向下舍入的值,并将其转换为
double

声纳不会因为
Math.floor
而抱怨-它抱怨是因为您将整数除法结果(它本身是一个向下取整的
int
eger)转换成了
double
。大多数情况下,这是一个错误(为什么故意自动循环并在之后立即转换为双精度)


哈,当我扩展你的答案时,你扩展了你的答案。:)谢谢你,Eran,但我有一个长型常数,结果是
返回距离单位为米/公里,单位为米我有一个异常,因为int是预期值,但long是被发现的。@josser好吧,你的常数没有理由是long,因为它的值很小。如果它必须是长的,你就需要将其转换为int。是的,你是对的——只要是一个整数就足够了。至于Math.floor,似乎没有必要在这里使用它。谢谢。那个代码没有编译,千米是一段很长的代码。您需要先将其转换为int。
int distanceInMeter = 505;

double result = distanceInMeter / KILOMETER_IN_METERS;
System.out.println(result); // 0.0

double result2 = distanceInMeter * 1.0 / KILOMETER_IN_METERS;
System.out.println(result2); // 0.505

double result3 = ((double) distanceInMeter) / KILOMETER_IN_METERS;
System.out.println(result3); // 0.505

1.0 * distanceInMeter / KILOMETER_IN_METERS
((double)distanceInMeter) / KILOMETER_IN_METERS