为什么当我将SQL Server中的40.54的值保存到Real类型的列时,它会返回给我一个更像40.53999878999而不是40.54的值?我已经看过几次,但从来没有弄明白为什么会发生这种情况.有没有其他人遇到过这个问题,如果是这样的话?
看看每个计算机科学家应该知道的浮点运算.
计算机中的浮点数不完全代表小数部分.相反,它们代表二进制分数.大多数小数都没有精确表示为二进制小数,因此有一些舍入.当这样的舍入二进制分数被转换回小数分数时,您将获得您描述的效果.
为了存储货币值,SQL数据库通常提供存储精确十进制数字的DECIMAL类型.这种格式对于计算机来说处理效率稍差,但是当你想避免十进制舍入错误时它非常有用.
浮点数使用二进制分数,它们与小数分数不完全对应.
为了钱,最好将分数存储为整数,或者使用十进制数字类型.例如,十进制(8,2)存储8位数,包括2位小数(xxxxxx.xx),即分精度.
简而言之,这几乎是因为三分之一不能用十进制来精确表达.有关详细信息,请查看David Goldberg的经典论文" 每个计算机科学家应该知道的关于浮点算术的内容 ".