假设我在区间[0.0, 1.0]
中有一个浮点值,它表示为字符串。我们将此值称为floatstr
。我们还假设这个值表示区间[0, 255]
中的一个整数。
将floatstr
转换为整数的公式为(在python中):int(round(float(floatstr)*255))
floatstr
中准确表示该值所需的最小小数位数是多少?如果有这样做的公式,这个最小数字是如何计算的?
两个数字显然不能切割它。你只能表示100个不同的值。三位数怎么样?
假设我们有一个数字x/255
,我们将其显示到小数点后的3位,有效地将其四舍五入到某个数字y/1000
。如果x/255
是1/255
与y/1000
最接近的倍数,则将y/1000
乘以255
并四舍五入将产生x
。
如果是x/255 = y/1000
,那么它显然是1/255
的最接近倍数。否则,x/255
必须在y/1000
的1/2000
的距离内才能舍入到y/1000
,因此y/1000
另一侧的1/255
的最近倍数必须至少距离1/255 - 1/2000
,比x/255
更远。因此,x/255
是1/255
与y/1000
最接近的倍数,3位数字就足够了。类似地,对于任何具有n
位的分母d
,n
位小数就足够了(如果d
是10的幂,则n-1
位小数就可以了)。
(我在这个推导中忽略了隐式浮点舍入误差的影响。对于小分母,浮点舍入误差不应该改变这个分析。)