为什么当我在SQL Server中将一个值保存到Real类型的列中,它返回给我的值更像是40.53999878999而不是40.54?我已经看到过这种情况几次,但从未找出发生这种情况的原因。是否有其他人遇到过这个问题,如果有,是什么原因造成的?
为什么当我在SQL Server中将一个值保存到Real类型的列中,它返回给我的值更像是40.53999878999而不是40.54?我已经看到过这种情况几次,但从未找出发生这种情况的原因。是否有其他人遇到过这个问题,如果有,是什么原因造成的?
看一下计算机科学家应该了解的浮点数算术。
计算机中的浮点数并不能精确地表示十进制小数。相反,它们表示的是二进制小数。大多数分数在二进制小数中没有精确的表示,因此会进行一些四舍五入。当这样一个四舍五入的二进制小数被转换回十进制小数时,就会出现你所描述的效果。
对于存储货币值,SQL数据库通常提供了一个存储精确十进制数字的DECIMAL类型。这种格式对计算机来说稍微不那么高效,但在想要避免十进制舍入误差时非常有用。
1/2
在两个系统上都可以精确地表示。 - axiac浮点数使用二进制小数,与十进制小数不完全对应。
对于货币,最好将分数作为整数存储,或者使用十进制数类型。例如,Decimal(8,2) 存储 8 位数字,包括 2 位小数(xxxxxx.xx),即精确到分的精度。