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