2.333333333333333333333
向上舍入为2.3333333333333335
。1.X3333333333333333
有时会向上舍入为1.X333333333333334
,但有时不会。{/ li>
0.X333333333333333
未被四舍五入。
1.33333333333333333333
# => 1.3333333333333333
1.43333333333333333333
# => 1.4333333333333333
1.53333333333333333333
# => 1.5333333333333334
1.63333333333333333333
# => 1.6333333333333333
1.73333333333333333333
# => 1.7333333333333334
1.83333333333333333333
# => 1.8333333333333333
1.93333333333333333333
# => 1.9333333333333333
这是一个错误还是只是精确的未定义行为?
答案 0 :(得分:1)
在IEEE 754浮点中,接近零的数字用更小(更好)的绝对精度表示。即使不查看the “double-precision” binary representation的详细信息,也是完全正常的,可以预料到:
2.3333333333333333
附近的任意数字有时只能表示在0.0000000000000002之内,1
和2
之间的数字可以表示在0.0000000000000001之内,并且0
和1
之间的数字可以表示为精度优于0.0000000000000001。如果你看一下表示的细节,你会发现精度每次变化都是2(也就是说,对于1和2之间的所有数字都是一样的,对于2之间的所有数字都是一样的) 4和2之间的数字精度比1和2之间数字的精度差2倍。
对于1到2之间的数字,精度为1/2 52 。这是十进制0.0000000000000002220446049250313080847263336181640625
。如果您选择介于1和2之间的任意数字,即使是具有简单小数表示的,您也不能指望它的精确度超过此精度的一半。
如果您在选择表示的数字中有一些余地,但希望它们完全表示为双精度IEEE 754浮点数,请不要选择具有十进制简单表示的数字但是数字很简单二进制表示。例如,这些是用十进制0.5
,0.25
,0.375
编写的数字,......