sql存储不同的值然后我存储

时间:2011-04-12 13:55:09

标签: .net sql-server-2005 tsql

我正在使用sql server 2005和.NET。 我有一个名为“价格”浮动列的表。 当我存储1890时,它存储1889.99966796875。

是什么原因?

3 个答案:

答案 0 :(得分:5)

浮点数是一种特殊数据类型,用于存储范围广泛的数字。权衡是精确的 - 这是你所看到的问题。 Floating point numbers

您可能希望使用小数数据类型或金钱来存储您的值。

答案 1 :(得分:3)

浮动数字无法映射到所有数字的原因是分数的十进制和二进制系统之间的不匹配。

1889.99966796875是此浮点域中最接近1890的数字,因此可以使用二进制表示法找到最接近此数字的数字。

其他类型,如十进制和金钱,使用其他更多内存消耗技术来存储数字(例如,在一个字符串中,您可以存储任何数字,但当然这不是最有效的方法数学)

一个简单的例子:我自己的二元系统中的0.3:

0.1b (inary) would be 0.5 d (ecimal) so too much...
0.01b -->  0.25d (1/4 too little)
0.011 -->  0.375 (1/4 + 1/8 too much)
0.0101 --> 0.3125 (1/4 + 1/16 still too much)
...
0.010011 --> 1/4 +1/32 + 1/64 = 0.296875

假设我的系统有6位表示分数,0.296875将是该域最接近的。由于十进制/二进制系统,无法访问正确的数字。

有关示例,请参阅: Floating point inaccuracy examples

在这里可以找到你的问题的精彩阐述: http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html

另一个注意事项:它实际上是关于不匹配,而不是关于系统的“质量”:例如,在十进制表示法中,您不能表示1/3 100%准确,而这在其他系统中是完全可能的。

答案 2 :(得分:2)

您想要存储确切数字或进行数学计算的任何数字都应存储为十进制或数字而不是浮点数。这是一种不精确的数据类型,它将导致舍入错误和不正确的计算。一般来说,应该避免浮动。