对于此代码块:
int num = 5;
int denom = 7;
double d = num / denom;
d
的值为0.0
。可以通过强制类型转换来让它发挥作用:
double d = ((double) num) / denom;
但是是否有另一种方法可以得到正确的double
结果呢?我不喜欢将基本类型强制转换,因为谁知道会发生什么。
对于此代码块:
int num = 5;
int denom = 7;
double d = num / denom;
d
的值为0.0
。可以通过强制类型转换来让它发挥作用:
double d = ((double) num) / denom;
但是是否有另一种方法可以得到正确的double
结果呢?我不喜欢将基本类型强制转换,因为谁知道会发生什么。
1.0
仍然会以不同的方式更改结果的类型。 “对我来说似乎是肮脏的代码”并没有解释您认为在哪种情况下乘以1.0
实际上更好(或者为什么可能更好)。 - Matthew Flaschen(double)num
会以某种方式更改num
。实际上并不是这样-它只是为语句的上下文创建了一个临时double。 - Paul Tomblin把原始类型强制转换使用起来有什么问题吗?
如果你不想强制转换,你可以这样做:
double d = num * 1.0 / denom;
double d = num * 1D / denom;
- BrainSlugs83如果你更改了一个变量的类型,那么如果你的公式发生变化,你就需要记得再次加入一个double,因为如果这个变量不再参与计算,结果就会出错。我有一个习惯在计算中进行类型转换,并在其旁边添加注释。
double d = 5 / (double) 20; //cast to double, to do floating point calculations
请注意,对结果进行转换并不能解决问题。
double d = (double)(5 / 20); //produces 0.0
也许你不会显式地进行类型转换,但它会发生。
现在,我们有几种方法可以尝试获得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);
现在,如果你问:哪个更好?显式的?还是隐式的?
好吧,不要给出一个直接的答案。只需记住:我们程序员不喜欢源代码中的惊喜或魔法。而且,额外的操作肯定不会使您的代码更有效率。对吧?
将其中一个整数或两个整数都转换为浮点数,以强制使用浮点数进行计算。否则,始终会优先选择整数运算。因此:
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
我认为你所考虑的铸造方式并没有任何问题。
最好的方法是
int i = 3;
Double d = i * 1.0;
d is 3.0 now.
使用类似以下的内容:
double step = 1d / 5;
(1d 是将数字 1 转换为 double 类型)
class Utils
{
public static double divide(int num, int denom) {
return ((double) num) / denom;
}
}
这样可以让你查找(仅一次)强制转换是否完全符合你的要求。该方法也可以接受测试,以确保它继续按照你的意愿执行。无论你使用什么技巧来引起除法(你可以使用这里的任何答案),只要它产生正确的结果即可。在任何需要除两个整数的地方,现在你只需调用Utils::divide
并相信它会做正确的事情。
只需添加“D”。
int i = 6;
double d = i / 2D; // This will divide bei double.
System.out.println(d); // This will print a double. = 3D
d
是下一个最好的选择。我认为 D
有害,因为它看起来太像数字,容易与数字相邻。 - AndrewF