为什么Java中允许双字面的任意精度?

aio*_*obe 6 java syntax literals

我刚从Peter Lawreys的帖子中了解到这是有效的表达方式,并且评估为true.

333333333333333.33d == 333333333333333.3d
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么允许双重文字不能用双精度表示,而不能表示的整数文字是不允许的.这个决定的理由是什么?


旁注,我实际上可以触发双范围文字的范围编译错误:-)

99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999d
Run Code Online (Sandbox Code Playgroud)

因此,只要我们处于(最小,最大)范围内,文字就会变得近似,但是当它超出范围时,似乎编译器拒绝接近它.

Fle*_*exo 9

问题是您可能键入的极少数小数可以完全表示为IEEE float.因此,如果你删除所有非精确常量,你会使用双文字非常笨拙.大多数时候,"假装我们可以代表它"的行为更有用.