对于这个代码块:
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;
但是有没有其他方法可以得到正确的双重结果呢?我不喜欢使用原始类型,谁知道会发生什么。
当前回答
将其中一个整数/两个整数强制转换为浮点数,以强制使用浮点数学完成操作。否则,整数数学总是首选。所以:
1. double d = (double)5 / 20;
2. double v = (double)5 / (double) 20;
3. double v = 5 / (double) 20;
请注意,强制转换结果不会做到这一点。因为第一次除法是按照优先级规则进行的。
double d = (double)(5 / 20); //produces 0.0
我不认为你所考虑的选角有任何问题。
其他回答
只要加上“D”。
int i = 6;
double d = i / 2D; // This will divide bei double.
System.out.println(d); // This will print a double. = 3D
double num = 5;
这样就避免了转换。但是您会发现强制转换是定义良好的。你不用猜,只要看看JLS就知道了。Int到double是一个扩大转换。从§5.1.2:
扩展基元转换则不然 失去关于整体的信息 数值的大小。 […] 整型或长值的转换 浮动:浮动,或具有长值 加倍,可能导致损失 精确——也就是说,结果可能会失败 一些最不重要的片段 值。在这种情况下,结果 浮点值是a 的正确四舍五入版本 整数值,使用IEEE 754 四舍五入模式(§4.2.4)。
5可以被精确地表示为double。
铸造原语有什么问题?
如果你因为某种原因不想施法,你可以这样做
double d = num * 1.0 / denom;
如果你改变了一个变量的类型如果公式改变了,你必须记得再加入一个double,因为如果这个变量不再是计算的一部分,结果就会混乱。我习惯在计算中进行强制转换,并在它旁边添加注释。
double d = 5 / (double) 20; //cast to double, to do floating point calculations
请注意,强制转换结果不会做到这一点
double d = (double)(5 / 20); //produces 0.0
将其中一个整数/两个整数强制转换为浮点数,以强制使用浮点数学完成操作。否则,整数数学总是首选。所以:
1. double d = (double)5 / 20;
2. double v = (double)5 / (double) 20;
3. double v = 5 / (double) 20;
请注意,强制转换结果不会做到这一点。因为第一次除法是按照优先级规则进行的。
double d = (double)(5 / 20); //produces 0.0
我不认为你所考虑的选角有任何问题。