非整数float类型数值小数点右侧最后一位非零数字是否恒为5?
问题1解答:非整数float的小数点右侧最后一位非零数字是否恒为5?
结论为是,对应证明如下:
- 所有符合IEEE 754标准的32位单精度float值,本质上都可以表示为
k * 2^m的形式,其中k为整数,m为可正可负的整数。 - 如果该值为非整数,说明m必然为负数,设m = -n(n为正整数),则该值可以改写为
k / (2^n)。 - 要将该分数转换为十进制有限小数,分子分母同乘
5^n,可得(k * 5^n) / (10^n),即该值的十进制表示必然是分母为10的正整数次幂的有限小数。 - 分子
k *5^n的末尾数字只可能是0或5(5的任意正整数次幂末尾都是5,和任意整数相乘后末尾只能是0或5),因此该小数的最后一位非零数字必然为5。
问题2解答:小数点右侧需要连续出现多少个0,才可以判定后续不存在更多非零数字?
对于32位单精度float来说,该阈值为6,即小数点后连续出现6个0后,后续不可能再出现非零数字,原因如下:
- 32位float的尾数长度为23位,加上隐含的首位1,总共只有24位二进制有效位,对应十进制有效位约为
log10(2^24) ≈7.22,也就是最多只能保留7~8位十进制有效数字。 - 扣除至少1位的整数部分有效位,小数部分最多只能保留6~7位有效数字,因此如果小数部分已经连续出现6个0,剩余的位置已经超出float的精度范围,不可能存储非零的有效数字。
- 你提到的连续2个0后仍有非零数字的案例完全符合上述规则,2远小于阈值6,属于正常情况。
内容的提问来源于stack exchange,提问作者user11844224
相关产品推荐
相关产品推荐

