提问人:walnutmon 提问时间:6/30/2010 最后编辑:Tomwalnutmon 更新时间:8/11/2020 访问量:532089
整数除法:你如何产生双精度?
Integer division: How do you produce a double?
问:
对于此代码块:
int num = 5;
int denom = 7;
double d = num / denom;
的值为 。它可以通过铸造来强制工作:d
0.0
double d = ((double) num) / denom;
但是有没有其他方法可以获得正确的结果呢?我不喜欢投射基元,谁知道会发生什么。double
答:
double num = 5;
这样可以避免演员表。但您会发现,演员转换是明确定义的。您不必猜测,只需检查 JLS。int 到 double 是一个扩大的转换。从 §5.1.2 开始:
扩大基元转换不会 丢失有关整体的信息 数值的大小。
[...]
int 或 long 值的转换 浮点数,或长整型值 双倍,可能导致损失 精度——也就是说,结果可能会丢失 一些最不重要的位 值。在这种情况下,结果 浮点值将为 正确舍入的版本 整数值,使用 IEEE 754 舍入到最近模式 (§4.2.4)。
5 可以精确地表示为双精度。
评论
1.0
1.0
(double)num
num
转换基元有什么问题?
如果你因为某种原因不想投,你可以做
double d = num * 1.0 / denom;
评论
double d = num * 1D / denom;
我不喜欢投射基元,谁知道会发生什么。
为什么你对投射基元有一种非理性的恐惧?当您将 .如果您不确定它是如何工作的,请在 Java 语言规范中查找它。将 to 转换为是不断扩大的原始转换。int
double
int
double
您可以通过转换分母而不是分子来删除额外的一对括号:
double d = num / (double) denom;
评论
double d = (double) num / denom;
如果你改变一个变量的类型,你必须记住,如果你的公式改变,你要再次偷偷溜进双精度,因为如果这个变量不再是计算的一部分,结果就会搞砸。我养成了在计算中强制转换的习惯,并在其旁边添加注释。
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
我不认为你正在考虑的选角有任何问题。
使用类似的东西:
double step = 1d / 5;
(1d 是 double 的投射)
评论
类型铸造是唯一的办法
也许你不会明确地这样做,但它会发生。
现在,有几种方法可以尝试获得精确的值(where 和 are 类型,当然还有铸造double
num
denom
int
)-
- 使用显式强制转换:
double d = (double) num / denom;
double d = ((double) num) / denom;
double d = num / (double) denom;
double d = (double) num / (double) denom;
但不是double d = (double) (num / denom);
- 使用隐式强制转换:
double d = num * 1.0 / denom;
double d = num / 1d / denom;
double d = ( num + 0.0 ) / denom;
double d = num; d /= denom;
但不是
,也不是double d = num / denom * 1.0;
double d = 0.0 + ( num / denom );
现在,如果你问--哪个更好?明确?还是隐含的?
好吧,我们不要在这里遵循一个直接的答案。请记住 - 我们程序员不喜欢源代码中的惊喜或魔法。我们真的很讨厌复活节彩蛋。
此外,额外的操作绝对不会使您的代码更有效率。右?
评论
您可以考虑包装操作。例如:
class Utils
{
public static double divide(int num, int denom) {
return ((double) num) / denom;
}
}
这使您可以查找(仅一次)演员是否完全符合您的要求。此方法也可以进行测试,以确保它继续执行您想要的操作。你用什么技巧来引起分裂也没关系(你可以在这里使用任何答案),只要它产生正确的结果。在需要除以两个整数的任何地方,您现在只需调用并相信它做了正确的事情。Utils::divide
就用这个。
int fxd=1;
double percent= (double)(fxd*40)/100;
最好的方法是
int i = 3;
Double d = i * 1.0;
d is 3.0 now.
只需添加“D”即可。
int i = 6;
double d = i / 2D; // This will divide bei double.
System.out.println(d); // This will print a double. = 3D
评论
.0
d
D
评论