【发布时间】:2016-09-29 18:46:34
【问题描述】:
定义有什么区别
double example = 23.1d
或
double example = 23.1
为什么 long、float 和 double 可以以 l、f、d 结尾?
【问题讨论】:
-
有些人可能认为d后缀没用。但事实并非如此。例如 123 是 int 而 123d 是 double。
定义有什么区别
double example = 23.1d
或
double example = 23.1
为什么 long、float 和 double 可以以 l、f、d 结尾?
【问题讨论】:
double example = 23.1d; 和 double example = 23.1; 之间没有区别,因为没有类型后缀的浮点字面量总是被解释为双精度。
类型后缀是必要的,以避免在某些情况下产生歧义。
例如,java 支持方法重载。这意味着您可以拥有void x( float f ); 和void x( double d ); 这两个方法都称为x;选择哪一个取决于您通过的类型;如果您传递一个已知为 float 或 double 的变量,那么事情就很清楚了;但是如果你想传递一个文字,像这样:x( 5 );,那么你必须能够指定你的意思是这个 5 是浮点数还是双精度数,以便选择正确的方法。
还有其他一些非常细微的情况,文字的类型很重要。例如以下代码:
System.out.println( "" + (2/3.3333) );
System.out.println( "" + (2/3.3333f) );
产生以下输出:
0.6000060000600006
0.600006
...因为第一个数字是双精度数,而第二个数字是浮点数。
类似的消歧问题使得“L”类型后缀成为长整型字面量所必需的。
【讨论】:
23.1d(或只是 23.1,因为 double 是默认值)与 23.1f 是不同的数字。由于无法精确表示 23.1,因此 23.1f 是最接近 23.1 的浮点数,并且只有大约 6 个有效数字。作为双精度数,23.1 将有大约 16 个有效数字,因此可以更接近实际值。
注意
double example = 23.1f;
等价于
float f = 23.1f;
double example = (double)f;
【讨论】: