浮点数问题,我在早前的文章聊过这个问题,感兴趣的同学点下《lua 开发防坑指南》。最近项目刚好又遇到这个问题,再细致讲下。这里以lua做说明,其他语言道理也是一样的。
在计算机中,二进制表示数字的核心是整数除 2 取余,小数乘 2 取整。小数转换为二进制时,由于精度限制,许多小数无法被精确表示,而是会变成循环二进制小数。以下是0.1的二进制表示(基于小数部分乘2取整法):
0.1 的二进制表示
整数部分1的二进制是 1。
小数部分0.1的二进制转换过程:
0.1 × 2 = 0.2 → 整数部分0
0.2 × 2 = 0.4 → 整数部分0
0.4 × 2 = 0.8 → 整数部分0
0.8 × 2 = 1.6 → 整数部分1
0.6 × 2 = 1.2 → 整数部分1
0.2 × 2 = 0.4 → 整数部分0(从此开始循环)
继续阅读浮点数精度丢失问题

