MySQL奇怪的浮点数和小数行为

时间:2013-12-11 09:23:27

标签: mysql floating-point decimal

我的表格包含列float(10,5)decimal(10,5)

我将表更新为:

update table1
set decimaltesting = 12311123123123123.456789,
floattesting = 12311123123123123.456789;

结果变为:

decimal = 99999.99999
float = 100000.00000

但如果我将列更改为float(6,3)decimal(6,3)并使用与上面相同的值更新

结果变为:

float = 999.999
decimal = 999.999

为什么对于第一种情况,浮点值将为100000.00000

1 个答案:

答案 0 :(得分:2)

垃圾进入 - 垃圾出局

记住这个简单的规则。在通常情况下,您的语句将不正确 - 例如,因为严格的sql模式,它将失败并出现错误。但是,既然你正如你所描述的那样得到结果,我认为你已经允许这样的行为了。正确的观点是 - 你的应用程序知道关于它的模型数据类型 - 所以这些东西都在控制之下 - 并且你不会将垃圾传递给你的DBMS,结果也是垃圾。

始终关注精确度

您的示例是一个很好的演示 - 定点数据类型和浮点数据类型之间的区别。第一件事 - 根据manual page

  

为浮点或定点列分配值时   超出指定(或默认)精度所暗示的范围   scale,MySQL存储表示相应端点的值   该范围。

- 这就是为什么你会看到999.999等等。但是 - 奇怪的100000.00000怎么样?提示是 - 你只能看到浮点字段。为什么?因为MySQL会将您的超出范围的值转换为您的字段允许的最大值,但是,由于浮点值大致存储,因此no guarantee最终值将保持精度 - 因此,它可能会导致您的100000.00000值。{{1}}请注意,对于定点数据类型,这种情况永远不会发生。