H5W3
当前位置:H5W3 > java > 正文

java强制转换整数和浮点除法的结果

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

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

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

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

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 🙁 double )(表达式)表示先评估表达式,然后应用强制类型转换。
伟大的!

因此,在下面的下一行中,我们有:(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)甚至不存在就可以。

确定将规则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将转换为 double 数,而3.0将自动转换为 double 数,因此您最终将进行浮点除法而不是整数除法。 (double) 1 / 3也会发生同样的事情,因为除数是double,因此即使被除数是int,系统也会意识到您要进行浮点除法。除非您特别要求,否则编译器不希望您失去精度,因此,无论何时被除数或除数为double,它都会进行double划分。

另一方面:

(int) 1 / 3.0

…就像在说:

((int) 1) / 3.0

在这种情况下,您要告诉编译器它已经知道了什么:除数(1)是int。然后,您要求它除以double值(3.0)。由于被除数是double,它将执行double除法。

如您所述,1/3将产生零,因为这是整数除法的工作方式,并且两个数字都是整数。 1/(int)3.0也会发生同样的情况,因为您要告诉编译器在进行除法之前将3.0转换为int(与1/((int)3.0)一样)。

最后要记住的是,(int) 0.33也将转​​换为0,因为整数不能包含十进制值。因此,当您说(int)(1.0/3)时,您就在进行double的除法,但随后又将double转换为int,从而产生了0

本文地址:H5W3 » java强制转换整数和浮点除法的结果

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址