【问题标题】:Literal Assignment in Java [duplicate]Java中的文字赋值[重复]
【发布时间】: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。

标签: java double literals


【解决方案1】:

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”类型后缀成为长整型字面量所必需的。

【讨论】:

    【解决方案2】:

    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;
    

    【讨论】:

    • 非常感谢,为什么不能精确表示双精度数?
    • @themagiciant95 因为双精度数有限。
    猜你喜欢
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 2018-05-13
    • 2012-10-18
    • 2013-06-28
    相关资源
    最近更新 更多