【问题标题】:MySQL weird float and decimal behaviour [duplicate]MySQL奇怪的浮点和小数行为[重复]
【发布时间】:2013-12-11 09:23:27
【问题描述】:

我有一个包含列 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

【问题讨论】:

    标签: mysql floating-point decimal


    【解决方案1】:

    垃圾进 - 垃圾出

    记住这个简单的规则。您的语句在一般情况下是不正确的 - 例如,在严格的 sql 模式下,它会因错误而失败。但是,既然你得到了你所描述的结果,我假设你已经允许这种行为。正确的一点是 - 你的应用程序知道它的模型数据类型 - 所以这些事情都在控制之下 - 你没有将垃圾传递给你的 DBMS,从而导致垃圾也一样。 p>

    始终追求精准

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

    当一个浮点或定点列被分配一个值时 超出指定(或默认)精度所暗示的范围,并且 scale,MySQL存储代表对应端点的值 在那个范围内。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多