整数除法:你如何产生双倍?

时间:2010-06-29 20:50:39

标签: java casting integer-division

对于此代码块:

int num = 5;
int denom = 7;
double d = num / denom;

d的值为0.0。它可以通过强制转换来强制工作:

double d = ((double) num) / denom;

但是有另一种方法可以获得正确的double结果吗?我不喜欢铸造原始人,谁知道会发生什么。

11 个答案:

答案 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投射到doublewidening 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值(其中numdenomint类型,当然为铸造) -

  1. 使用显式转换:

    • double d = (double) num / denom;
    • double d = ((double) num) / denom;
    • double d = num / (double) denom;
    • double d = (double) num / (double) denom;
  2. 但不是double d = (double) (num / denom);

    1. 隐式转换:

      • double d = num * 1.0 / denom;
      • double d = num / 1d / denom;
      • double d = ( num + 0.0 ) / denom;
      • double d = num; d /= denom;
    2. 但不是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”即可。

,