Java 整数除法:如何生成一个双精度数?

Java 整数除法:如何生成一个双精度数?,java,casting,integer-division,Java,Casting,Integer Division,对于此代码块: int num = 5; int denom = 7; double d = num / denom; d的值为0.0。可以通过铸造强制工作: double d = ((double) num) / denom; 但是有没有其他方法可以获得正确的double结果?我不喜欢铸造原始人,谁知道会发生什么 double num = 5; 这样可以避免演员阵容。但是您会发现强制转换是定义良好的。你不必猜,只要查一下表就行了。int到double是一种加宽转换。发件人: 加宽基元转换

对于此代码块:

int num = 5;
int denom = 7;
double d = num / denom;
d
的值为
0.0
。可以通过铸造强制工作:

double d = ((double) num) / denom;
但是有没有其他方法可以获得正确的
double
结果?我不喜欢铸造原始人,谁知道会发生什么

double num = 5;
这样可以避免演员阵容。但是您会发现强制转换是定义良好的。你不必猜,只要查一下表就行了。int到double是一种加宽转换。发件人:

加宽基元转换不需要 丢失有关整个系统的信息 数值的大小

[……]

整型或长型值的转换 浮动,或长值浮动 加倍,可能导致损失 精确性也就是说,结果可能会丢失 数据的一些最低有效位 价值。在这种情况下,结果是 浮点值将是一个 正确四舍五入版本的 整数值,使用IEEE 754 四舍五入到最近的模式

5可以精确地表示为双精度

这样可以避免演员阵容。但是您会发现强制转换是定义良好的。你不必猜,只要查一下表就行了。int到double是一种加宽转换。发件人:

加宽基元转换不需要 丢失有关整个系统的信息 数值的大小

[……]

整型或长型值的转换 浮动,或长值浮动 加倍,可能导致损失 精确性也就是说,结果可能会丢失 数据的一些最低有效位 价值。在这种情况下,结果是 浮点值将是一个 正确四舍五入版本的 整数值,使用IEEE 754 四舍五入到最近的模式


5可以精确地表示为双精度。

铸造原语有什么问题

如果你出于某种原因不想出演,你可以这样做

double d = num * 1.0 / denom;

铸造原语有什么问题

如果你出于某种原因不想出演,你可以这样做

double d = num * 1.0 / denom;
我不喜欢铸造原始人,谁知道会发生什么

double num = 5;
为什么你对铸造原始人有一种非理性的恐惧?当您将
int
转换为
double
时,不会发生什么坏事。如果你只是不确定它是如何工作的,可以在。将
int
转换为
double
是一个错误

您可以通过铸造分母而不是分子来消除额外的一对括号:

double d = num / (double) denom;
我不喜欢铸造原始人,谁知道会发生什么

double num = 5;
为什么你对铸造原始人有一种非理性的恐惧?当您将
int
转换为
double
时,不会发生什么坏事。如果你只是不确定它是如何工作的,可以在。将
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

如果你改变了其中一个变量的类型,你必须记住,如果你的公式改变了,你必须再次潜入一个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

我不认为像您所想的那样进行强制转换有任何问题。

将一个整数/两个整数强制转换为浮点,以强制使用浮点数学完成操作。否则,始终首选整数数学。因此:

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 step = 1d / 5;
(1d是双精度转换)

是唯一的方法 也许你不会明确地这样做,但它会发生

现在,有几种方法可以尝试获得精确的
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)


    现在如果你在问-哪一个更好?明确的还是含蓄

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

    另外,额外的操作肯定不会使代码更高效。是吗?

    是唯一的办法 也许你不会明确地这样做,但它会发生

    现在,有几种方法可以尝试获得精确的
    double
    值(其中
    num
    denom
    int
    类型,当然还有强制转换)-

  • 用显式casti