12.1可以完全表示为浮点数吗?

Cla*_*diu 4 java math floating-point numbers floating-accuracy

这是参考这个问题中的评论:

Java中的这段代码产生12.100000000000001,这是使用64位双精度,它可以精确地呈现12.1. - Pyrolistical

这是真的?我觉得因为浮点数表示为2的幂的总和,所以无论你有多少位,你都不能完全代表12.1.但是,当我实现这两个算法并打印出带有许多有效数字的(12.1,3)调用它们的结果时,我得到了他和我的分别:

12.10000000000000000000000000000000000000000000000000000000000000000000000000 12.1000000000000010000000000000000000000000000000000000000000000000000000000000

我用这个打印过String.format("%76f").我知道这比所需的更多零,但我没有看到12.1中的任何四舍五入.

Ari*_*yck 15

没有.正如其他人在他的评论的后续注意中所指出的那样,两个(有限数量)两个幂的总和不能恰好相加到12.1.就像你不能在十进制中完全代表1/3,无论你在小数点后使用多少位数.

  • @Claudio - 在结果十进制数看起来恰好是12.1的情况下,这绝对是用于将`double`转换为十进制字符串的库例程的假象.它是向数字的"人类友好"版本四舍五入,而不是在数学上将最接近的十进制数显示给您提供的`double`. (3认同)

Ste*_*non 12

在二进制中,12.1是:

1100.000110011001100110011...
Run Code Online (Sandbox Code Playgroud)

由于这不会终止,因此无法在double或任何其他有限宽度二进制浮点类型的53个有效位中精确表示.


wal*_*lyk 9

尝试用二进制表示0.1:
0.5太大
0.25太大
0.125太大
0.0625适合,剩余0.0375
0.03125拟合,剩余0.00625
0.015625太大
0.0078125太大
0.00390625适合,并且离开剩余的0.00234375
0.001953125拟合,剩余的0.000390625

它将无限期地重复,创建一个基数为2的值0.00011001100 ......

不,它不能完全用双重表达.如果Java支持BCD或定点十进制,那将完全正常工作.