对于这个代码块:
int num = 5;
int denom = 7;
double d = num / denom;
d值为0.0。它可以通过施法强制工作:
double d = ((double) num) / denom;
但是有没有其他方法可以得到正确的双重结果呢?我不喜欢使用原始类型,谁知道会发生什么。
对于这个代码块:
int num = 5;
int denom = 7;
double d = num / denom;
d值为0.0。它可以通过施法强制工作:
double d = ((double) num) / denom;
但是有没有其他方法可以得到正确的双重结果呢?我不喜欢使用原始类型,谁知道会发生什么。
当前回答
您可以考虑对操作进行包装。例如:
class Utils
{
public static double divide(int num, int denom) {
return ((double) num) / denom;
}
}
这允许您查询(只有一次)强制转换是否完全符合您的要求。此方法还可以进行测试,以确保它继续执行您想要的操作。使用什么技巧来引起除法也不重要(您可以使用这里的任何答案),只要它得到正确的结果。在需要对两个整数进行除法的任何地方,现在只需调用Utils::divide,并相信它做的是正确的事情。
其他回答
您可以考虑对操作进行包装。例如:
class Utils
{
public static double divide(int num, int denom) {
return ((double) num) / denom;
}
}
这允许您查询(只有一次)强制转换是否完全符合您的要求。此方法还可以进行测试,以确保它继续执行您想要的操作。使用什么技巧来引起除法也不重要(您可以使用这里的任何答案),只要它得到正确的结果。在需要对两个整数进行除法的任何地方,现在只需调用Utils::divide,并相信它做的是正确的事情。
double num = 5;
这样就避免了转换。但是您会发现强制转换是定义良好的。你不用猜,只要看看JLS就知道了。Int到double是一个扩大转换。从§5.1.2:
扩展基元转换则不然 失去关于整体的信息 数值的大小。 […] 整型或长值的转换 浮动:浮动,或具有长值 加倍,可能导致损失 精确——也就是说,结果可能会失败 一些最不重要的片段 值。在这种情况下,结果 浮点值是a 的正确四舍五入版本 整数值,使用IEEE 754 四舍五入模式(§4.2.4)。
5可以被精确地表示为double。
可以使用以下语句:
double step = 1d / 5;
(1d是双重施法)
最好的办法是
int i = 3;
Double d = i * 1.0;
d is 3.0 now.
铸造原语有什么问题?
如果你因为某种原因不想施法,你可以这样做
double d = num * 1.0 / denom;