整数除法:你如何产生一个双精度?

对于这个代码块:

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值转换为float值,或将long值转换为double值可能会导致精度损失 – 也就是说,结果可能会丢失值的某些最低有效位。 在这种情况下,使用IEEE 754 round-to-nearest模式(§4.2.4) ,得到的浮点值将是整数值的正确舍入版本。

5可以完全expression为一个双。

铸造基元有什么问题?

如果你不想因为某种原因而投,你可以这样做

 double d = num * 1.0 / denom; 

我不喜欢投下原始人,谁知道会发生什么。

你为什么对铸造原始物有一种非理性的恐惧? 当你将一个int转换为double时,没有什么不好的事情发生。 如果您不确定它是如何工作的,请查看Java语言规范 。 将int 转换为double是一个扩大的原始转换 。

您可以通过投下分母而不是分子来摆脱额外的一对括号:

 double d = num / (double) denom; 

如果你改变一个variables的types,你必须记住如果你的公式改变,再次潜入一个double,因为如果这个variables停止作为计算的一部分,结果就搞砸了。 我习惯在计算中投射,并在旁边添加注释。

 double d = 5 / (double) 20; //cast to double, to do floating point calculations 

请注意,铸造结果不会这样做

 double d = (double)(5 / 20); //produces 0.0 

将其中一个整数/两个整数都浮起来以强制该操作用浮点数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 

我不认为你们在考虑铸造方面有什么问题。

铸造是唯一的途径


从整数除法生成一个double没有其他方法没有铸造 (可能是你不会明确做,但会发生)。

现在,有几种方法可以获得精确的double值(其中numdenominttypes,当然还有cast ) –

  1. 与明确的铸造:

    • 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);

  1. 用隐式投射:

    • 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 );

使用类似于:

 double step = 1d / 5; 

(1d是要加倍的)

你可能会考虑包装的操作。 例如:

 class Utils { public static double divide(int num, int denom) { return ((double) num) / denom; } } 

这可以让你查看(只是一次)演员是否做到了你想要的。 这种方法也可以进行testing,以确保它继续做你想做的事情。 你也可以使用什么技巧来引起分割(你可以使用这里的任何答案),只要它能产生正确的结果。 无论你需要分割两个整数,你现在可以调用Utils::divide并相信它做的是正确的事情。

就用这个吧

 int fxd=1; double percent= (double)(fxd*40)/100; 

最好的方法是

 int i = 3; Double d = i * 1.0; d is 3.0 now.