有人知道为什么将数据导出到 Excel 时,某些数字会从整数变为 5 位或以上的小数。例如,800 将变为 799.999996,或者可能变为 800.00005。它不会对每个带有数字的单元格都这样做——似乎根本没有一致性。
有没有办法防止这种情况发生,或者这是数据库固有的问题?
这个问题困扰了我好几年,我似乎无法在任何地方找到答案,但也许现在有人可以。
谢谢!
答案1
我们人类习惯使用“十进制”来表示数字。
这将一些特定常数设置为“无理数”(参见https://en.wikipedia.org/wiki/Irrational_number) 例如:1/3、1/7、平方根二、圆周率就是其中的几个。
现在,如果您选择使用二进制(就像计算机一样),无理数就会发生变化;例如,当切换到“编程和二进制(二进制)”模式时,1/10 就是一,在我 Ubuntu 上的“计算器”中由“0.000110011”组成。小数点右边的 1 现在代表 1/16+1/32+1/256+1/512,相当于十进制的“0.099609375”——这非常接近 1/10,但不完全相同。
同样的道理也适用于一组价值观。哪些价值观?我说不出来,但我确信有很多这样的价值观。
现在在此基础上添加有限精度浮点表示的效果,例如仅使用 32 位(参考:格式描述这里,与十进制的“8+E2”比较)。
1/10(十进制)= 0.0 0011 0011 0011 0011 ...(二进制)
值得一提的是:以二进制表示的 800 不应该出现奇怪的小数;因为 8 =2^3 且 2 是 2^0,都是简单的二进制数字,在计算机内部以浮点表示形式存储。