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,无论你在小数点后使用多少位数.
Ste*_*non 12
在二进制中,12.1是:
1100.000110011001100110011...
Run Code Online (Sandbox Code Playgroud)
由于这不会终止,因此无法在double或任何其他有限宽度二进制浮点类型的53个有效位中精确表示.
尝试用二进制表示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或定点十进制,那将完全正常工作.