在通用的双精度格式中,数字由一个符号位、一个11位指数和一个53位分数部分组成,称为尾数。尾数总是一个53位的非负整数除以2
52(也可以写成一个二进制数字、一个基数点和52个二进制数字)。
.1无法被准确表示。它的指数为-4,尾数为7205759403792794/2
52。也就是说,最接近.1的
double
是7205759403792794•2
-52•2
-4=0.1000000000000000055511151231257827021181583404541015625。
最接近.7的
double
具有6305039478318694/2
52的尾数和-1的指数;它是6305039478318694•2
-52•2
-1=0.6999999999999999555910790149937383830547332763671875。
当你把这两个数字相加时,结果是0.7999999999999999611421941381195210851728916168212890625。这在
double
中也不能准确表示;它必须四舍五入到最近可表示的值,当你乘以10时,它还必须再次四舍五入。然而,你可以看到总和小于.8。最终结果小于8,所以转换为整数会将其截断为7。
double
最接近.8是0.8000000000000000444089209850062616169452667236328125。当你将它加到0.1000000000000000055511151231257827021181583404541015625时,总和是0.9000000000000000499600361081320443190634250640869140625。正如你所看到的,它大于.9。四舍五入并乘以10的最终结果将是9或更大,因此将其转换为整数将产生9。
其他一些你尝试过的值没有向下舍入只是偶然。每个不准确可表示的值都落在两个可表示值之间,一个更高一个更低。有些更接近较高的值,有些更接近较低的值,你只是碰巧选择了更接近较高可表示值并被向上舍入的值。
(0.6 + 0.7) * 10
。 - Daniel Fischer.1+.7
小于 8 而.2+.7
不小于 9。也就是说,虽然它们可能提供了最终回答问题的信息,但它们实际上没有回答这个问题。 - Eric Postpischil