我知道二进制表示法无法精确地表示浮点数(同时也了解为什么 0.1 + 0.2 == 0.3 是不正确的)。现在,当我尝试使用不同的浮点算术进行实验时,我遇到了一个问题:
通过观察十进制数字转换为二进制格式的方式,我得出结论:具有相同小数部分的两个数字在十进制表示法中(例如:0.3 和 1.3),一旦转换为二进制形式,它们将具有相同的小数部分。
为了测试这个结论,我在 Python 中尝试了以下代码:
print(f"{0.3:.20f}")
print(f"{1.3:.20f}")
0.29999999999999998890
1.30000000000000004441
我不理解为什么小数部分会出现不同,因此为了更好地了解情况,我尝试了这个方法:
print(f"{0.3:.20f}")
print(f"{1 + 0.3:.20f}")
print(f"{1.3:.20f}")
0.29999999999999998890
1.30000000000000004441
1.30000000000000004441
问题:由于 1 不是一个近似数(因为我们可以用二进制的精确形式 2^0 来表示 1),所以为什么加 1 会改变数字的小数部分呢?
此外,当我们从 1.3 中减去 1 时,为什么结果值不等于 0.3?
print(f"{1.3:.20f}")
print(f"{1.3 - 1:.20f}")
print(f"{0.3:.20f}")
1.30000000000000004441
0.30000000000000004441
0.29999999999999998890
我的整个问题可以用以下并置来概括:
print(1 + .3 == 1.3)
print(0.3 == 1.3 -1)
True
False