Lit*_*rat 5 java floating-point
我是初学者,对我来说有些事情没有多大意义.请你能解释我哪里出错了.如果以前曾被问过,我很抱歉.
这里小数点的存在意味着使用浮点除法进行评估.
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
Run Code Online (Sandbox Code Playgroud)
显然,下面是"截断整数除法"的一个例子.这对我来说似乎有点奇怪,但还可以.
System.out.println(1/3); // this prints: 0
Run Code Online (Sandbox Code Playgroud)
可以这样说:"在下面的行中,(double)演员被评估为第一.它有效地说:"将1/3视为双重 - 不要使用截断整数除法.而是使用浮点除法.""
System.out.println((double)1/3); // this prints: 0.3333333333333333
Run Code Online (Sandbox Code Playgroud)
下面,我们得到0.0 - 这是怎么发生的?
System.out.println((double)(1/3)); // this prints: 0.0
Run Code Online (Sandbox Code Playgroud)
好的,也许额外的括号意味着(1/3)得到第一次评估.它使用截断整数除法得到0进行评估.然后应用double给出0.0 Ok这是有道理的
好的,我们也许可以在这里提出一些一般规则:
规则1 :( double)表达式首先应用(double)cast,然后计算表达式.
规则2 :( double)(表达式)表示计算表达式然后应用强制转换.大!
所以在下面的下一行我们有:(int)表达式,所以我想我们可以应用规则1).(int)演员表被评估为1st.它有效地说:"将1.0/3视为一个int - 不要像使用double那样使用尽可能多的内存.不要使用浮点除法,而是应用截断整数除法.""所以我们有0对吗? .
System.out.println((int)1/3.0); // this prints: 0.3333333333333333
Run Code Online (Sandbox Code Playgroud)
好的,我们有0.33333所以(int)演员没有被评估为1st.好像它不在那里.我们提出第3条规则:
规则3:(int)表达式意味着完全忽略(int)强制转换只是计算表达式,就像(int)甚至不存在一样.
好的将规则3应用到下面的行,我们有(int)但我们只是忽略它.使用浮点除法评估1.0/3.0,得到0.3333333.成功!
System.out.println((int)1.0/3.0); // this prints: 0.3333333333333333
Run Code Online (Sandbox Code Playgroud)
在下面的最后一行,我们再次(int),但我们只是忽略它.(1.0/3)使用浮点除法得到0.3333333333对吧?没有.
System.out.println((int)(1.0/3)); // this prints: 0
Run Code Online (Sandbox Code Playgroud)
好的,现在我很困惑.请问你能帮助我解决这个问题吗?
Java的语言解析规则基本上暗示了代码中的大量括号,这些括号基于其操作顺序规则.了解Java认为括号的位置将有助于您了解此行为.当你说:
(double) 1 / 3.0
Run Code Online (Sandbox Code Playgroud)
......这相当于说:
((double) 1) / 3.0
Run Code Online (Sandbox Code Playgroud)
这意味着1转换为double,3.0自动转换为double,因此您最终会执行浮点除法而不是整数除法.同样的事情会发生(double) 1 / 3,因为除数是a double,所以即使被除数是一个int,系统也意识到你想做浮点除法.编译器不希望你失去精度,除非你特别要求,所以无论double何时分红或除数是a ,它都会进行double除法.
另一方面:
(int) 1 / 3.0
Run Code Online (Sandbox Code Playgroud)
......跟说:
((int) 1) / 3.0
Run Code Online (Sandbox Code Playgroud)
在这种情况下,你告诉编译器它已经知道的东西:除数(1)是一个int.然后你要求它除以一个double值(3.0).由于红利是a double,它将执行double除法.
如你所述,1/3将产生零,因为这是整数除法的工作方式,两个数字都是整数.同样的情况也会发生,1/(int)3.0因为你告诉编译器在分割发生之前将其3.0变为a int(如1/((int)3.0)).
要记住的最后一点是,(int) 0.33也会转换为0,因为整数不能包含十进制值.所以,当你说(int)(1.0/3),你正在进行double分裂,但是之后你将双重转化为int后来的产生0.
| 归档时间: |
|
| 查看次数: |
5268 次 |
| 最近记录: |