当前位置: 首页 > 面试题库 >

将强制转换应用于整数和浮点除法的结果:这是怎么回事?

孟成文
2023-03-14
问题内容

我是一个初学者,有些东西对我来说意义不大。请如此友善地解释我要去哪里错了。对不起,如果以前已经问过这个问题。

在此,小数点的存在意味着将使用浮点除法对它们进行评估。

System.out.println(1/3.0); // this prints: 0.3333333333333333
System.out.println(1.0/3); // this prints: 0.3333333333333333
System.out.println(1.0/3.0); // this prints: 0.3333333333333333

显然,以下是“截断整数除法”的示例。对我来说似乎有点奇怪,但是还可以。

System.out.println(1/3); // this prints: 0

可以这样说吗:“在下面的行中,(双精度)强制转换被求值为1。它有效地表示:”将1/3视为双精度-不要使用截断整数除法。而是使用浮点除法。“”

System.out.println((double)1/3); // this prints: 0.3333333333333333

在下面,但是我们得到0.0-怎么发生的?

System.out.println((double)(1/3)); // this prints: 0.0

好的,所以多余的括号可能意味着(1/3)被评估为第一。使用截断整数除以0进行求值。 然后 应用double,使我们得到0.0 Ok才有意义

好的,所以我们可以在这里提出一些通用规则:

规则1 :(双精度)表达式表示先应用(双精度)强制转换,然后评估表达式。

规则2 :(双精度)(表达式)表示先评估表达式, 然后 应用强制转换。大!

因此,在下面的下一行中,我们有:(int)表达式,因此我想我们可以应用规则1)。(int)强制转换被评估为第一。它有效地说:“将int处理为1.0 /
3,不要像使用double那样使用过多的内存。不要使用浮点除法,而是应用截断整数除法。””因此,我们有0对吗? 。

System.out.println((int)1/3.0); // this prints: 0.3333333333333333

好的,我们有0.33333,因此(int)强制转换不会被评估为1st。好像它不在那儿。让我们提出第三条规则:

规则3:(int)表达式表示完全忽略(int)强制转换,只是评估表达式(int(int)甚至不存在)。

确定将规则3应用于下面的行,我们有(int),但是我们将忽略它。用浮点除法评估1.0 / 3.0,得出0.3333333。成功!

System.out.println((int)1.0/3.0); // this prints: 0.3333333333333333

在下面的最后一行中,我们再次具有(int),但是我们将忽略它。(1.0 / 3)是使用浮点除法评估的,得出0.3333333333对吗?没有。

System.out.println((int)(1.0/3)); // this prints: 0

好吧,我很困惑。请您能帮我解决这个问题吗?


问题答案:

Java的语言解析规则基本上基于其 操作顺序 规则在您的代码中的每个地方都隐含着许多括号。了解Java认为括号的位置将有助于您理解此行为。当你说:

(double) 1 / 3.0

…相当于说:

((double) 1) / 3.0

这意味着1将转换为双精度数,而3.0将自动转换为双精度数,因此最终将进行浮点除法而不是整数除法。(double) 1 / 3由于除数为a
double,因此也会发生同样的事情,即使被除数为a ,系统也会int意识到您要进行浮点除法。除非您特别要求,否则编译器不希望您失去精度,因此
,无论何时 被除数或除数为adouble,它都会进行double除法

另一方面:

(int) 1 / 3.0

…等于说:

((int) 1) / 3.0

在这种情况下,您要告诉编译器它已经知道的内容:除数(1)是一个int。然后,您要它除以一个double值(3.0)。由于股息为a
double,它将执行double除法。

如您所述,1/3将产生零,因为整数除法就是这样,两个数字都是整数。也会发生同样的情况,1/(int)3.0因为您要告诉编译器在除法发生之前将3.0变成一个。int``1/((int)3.0)

要记住的最后一点是,它(int) 0.33也将转换为0,因为整数不能包含十进制值。因此,当您说时(int)(1.0/3),您正在执行double除法,但随后您将双精度转换为int事后生成0



 类似资料:
  • 问题内容: 5年前关闭。 我必须将两个整数相除并得到一个浮点数作为我的代码: 我用调试器检查值 为什么结果为0.0?我应该怎么做才能获得正确的浮动? 问题答案: 当您将两个数相除时,将执行整数除法,在这种情况下,将导致22/64 =0。只有完成此操作后,您才能创建一个。和的表示是。如果要执行浮点除法,则应 在 除法 之前进行 强制转换:

  • 问题内容: 我想使用PostgreSQL 9.3将计算出的值转换为data type 。 我的第一次尝试: 给我这个错误: 我的第二次尝试: 给我这个错误: 问题答案: 您需要使用以下语法:

  • 与许多语言一样,Swift的除法运算符默认为整数除法,因此: 如果要进行浮点除法,必须执行以下操作 同样,与大多数其他语言一样,您不能强制转换整个操作: 发生这种情况是因为swift执行1和2的整数除法()并获得0,然后它尝试将其转换为,有效地为您提供0.0。 我很好奇为什么以下方法会奏效: 我觉得这应该会产生与双倍(1/2)相同的结果。为什么不呢?

  • 问题内容: 代码输出: 为什么值不同?为什么第二个输出看起来如此? 问题答案: 的浮点表示形式不正确: 那是因为浮点算法只是一种近似,尤其是当您超出了CPU可以准确建模的范围时(因为浮点是在硬件中处理的)。 整数除法不必将数字表示为浮点数,它只需要除以整数即可,在Python中整数可以任意增大而不会造成精度损失。 另请参阅: 浮点算法: Python教程中的 问题和局限性 每个程序员应了解的浮点运

  • 问题内容: 因此,如果我有一个范围为‘0-1024’的数字,并且希望将其取为‘0-255’,那么数学将决定将输入除以输入的最大值(在这种情况下为1024),从而得出我的数字介于0.0-1.0之间。然后将其乘以目标范围(255)。 我要做什么! 但是由于Java中的某些原因(使用处理),它将始终返回值0。 该代码将像这样简单 但是我只得到0.0。我已经尝试过两次和诠释。一切都无济于事。为什么!? 问

  • 问题内容: 我试图将浮点数转换为php中的int值: 我可以使用ceil使其工作,但是有人可以向我解释吗? 问题答案: 这是因为以10为底的有限表示形式的数字在PHP使用的浮点表示形式中可能具有也可能没有确切的表示形式。 看到 由于总是将数字四舍五入,因此制图表达中的一个小错误使它可以将其四舍五入为一个原本希望的数字。 考虑改为使用。