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

我刚从Peter Lawreys的post中了解到这是有效的表达,并且评估为true

 333333333333333.33d == 333333333333333.3d 

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


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

 99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999d 

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

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

主要原因可能是Java无法确定何时用完精度,因为没有CPU操作代码。

为什么没有CPU标志或类似? 因为数字的表示根本不允许它。 例如,即使像“0.1”这样的简单数字也没有明确的表示。 0.1给出“00111111 10111001 10011001 10011001 10011001 10011001 10011001 10011010”(参见http://www.binaryconvert.com/result_double.html?decimal=048046049 )。

该值不是精确到0.1而是1.00000000000000005551115123126E-1

因此,即使对于这些“简单”的情况,代码也必须抛出exception。