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

对于这个代码块:

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

d的值是0.0。它可以通过施法强制工作:

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

但是是否有其他方法来获得正确的double结果?我不喜欢使用原始类型,谁知道会发生什么。

507806 次浏览
double num = 5;

这样就避免了转换。但是您会发现强制转换是定义良好的。你不必猜测,只要检查JLS。Int到double是一个扩大转换。从§5.1.2:

扩大基元转换没有 失去关于整体的信息

.数值的大小

[…]

整数或长值的转换 浮动:浮动,或具有长值 加倍,可能导致损失 精确——也就是说,结果可能会失败 一些最不重要的片段 值。在这种情况下,结果 浮点值是a 的正确四舍五入版本 整数值,使用IEEE 754 (§4.2.4).

5可以被精确地表示为double。

铸造原语有什么问题?

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

double d = num * 1.0 / denom;

我不喜欢使用原始类型,谁知道会发生什么。

为什么你对施放原语有一种非理性的恐惧?将int类型强制转换为double类型时,不会发生任何不好的事情。如果你只是不确定它是如何工作的,在Java语言规范中查找它。将int转换为double扩大原语转换

你可以通过强制转换分母而不是分子来消除额外的一对括号:

double d = num / (double) denom;

如果你改变了一个变量的类型如果公式改变了,你必须记得再加入一个double,因为如果这个变量不再是计算的一部分,结果就会混乱。我习惯在计算中进行强制转换,并在它旁边添加注释。

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值(其中numdenomint类型,当然还有与铸造类型)

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


现在如果你问——哪一个是更好的?明确吗?还是隐式?

好吧,我们不要直接回答。简单地记住——我们程序员不喜欢源代码中的惊喜或魔法。我们真的很讨厌复活节彩蛋。

另外,额外的操作肯定不会使您的代码更有效率。对吧?

您可以考虑对操作进行包装。例如:

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