对于此代码块:
int num = 5;
int denom = 7;
double d = num / denom;
d
的值为0.0
。它可以通过强制转换来强制工作:
double d = ((double) num) / denom;
但是有另一种方法可以获得正确的double
结果吗?我不喜欢铸造原始人,谁知道会发生什么。
答案 0 :(得分:144)
double num = 5;
这可以避免演员表演。但是你会发现演员转换是明确定义的。您无需猜测,只需查看JLS即可。 int to double是一个扩大的转换。来自§5.1.2:
扩展原始转换不会 丢失有关整体的信息 数值的大小。
[...]
转换int或long值 浮动,或长期价值 加倍,可能导致损失 精度 - 也就是说,结果可能会丢失 一些最不重要的部分 价值。在这种情况下,由此产生 浮点值将是一个 正确的圆形版本 整数值,使用IEEE 754 舍入到最近的模式(§4.2.4)。
5可以完全表示为双。
答案 1 :(得分:92)
投射基元有什么问题?
如果您因某些原因不想演员,可以
double d = num * 1.0 / denom;
答案 2 :(得分:65)
我不喜欢投射原语,谁知道会发生什么。
为什么你对投射原语有一种非理性的恐惧?将int
投射到double
时,不会发生任何不良后果。如果您不确定它是如何工作的,请在Java Language Specification中查找。将int
投射到double
是widening primitive conversion。
你可以通过投射分母而不是分子来摆脱额外的括号:
double d = num / (double) denom;
答案 3 :(得分:25)
如果您更改了一个必须记住的变量的类型,如果您的公式发生更改,则再次潜入一个double,因为如果此变量不再是计算的一部分,则结果会搞砸。我养成了在计算中投射的习惯,并在旁边添加注释。
double d = 5 / (double) 20; //cast to double, to do floating point calculations
请注意,投射结果不会这样做
double d = (double)(5 / 20); //produces 0.0
答案 4 :(得分:14)
将一个整数/两个整数转换为float以强制使用浮点Math完成操作。否则,整数Math始终是首选。所以:
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
我不认为你正在思考的是否有任何铸造问题。
答案 5 :(得分:8)
从整数除法生成double
- 没有casting没有别的办法(可能你不会明确地做,但会发生)。
现在,有几种方法可以尝试获得精确的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 );
答案 6 :(得分:2)
使用类似的东西:
double step = 1d / 5;
(1d是演员加倍)
答案 7 :(得分:0)
您可以考虑包装操作。例如:
class Utils
{
public static double divide(int num, int denom) {
return ((double) num) / denom;
}
}
这使您可以查看(仅一次)演员表是否完全符合您的要求。此方法也可能需要进行测试,以确保它继续执行您想要的操作。只要它产生正确的结果,使用什么技巧来导致划分(你可以使用这里的任何答案)也没关系。你需要划分两个整数的任何地方,你现在可以只调用Utils::divide
并相信它做的是正确的。
答案 8 :(得分:0)
只需使用它。
int fxd=1;
double percent= (double)(fxd*40)/100;
答案 9 :(得分:0)
最好的方法是
int i = 3;
Double d = i * 1.0;
d is 3.0 now.
答案 10 :(得分:0)
只需添加“ D”即可。
,