【问题标题】:Can't alter table field from float to decimal in mysql-workbench无法在 mysql-workbench 中将表字段从浮点数更改为十进制数
【发布时间】:2019-03-05 03:51:02
【问题描述】:

我创建了一个带有FLOAT 类型列的表。但是,我发现当我查询列的MAXMINAVG 值时,我得到的数字不准确,其中返回的值大于表中实际存储的值。例如,这是表中的实际最大数:0.00348675。不知何故,MAX 返回:0.0034867459908127785

错误是由于选择了FLOAT 作为类型。为此,我想将列类型更改为DECIMAL.

我在 Ubuntu 18 中使用 mysql-workbench。当我右键单击表格并选择 Alter Table 时,我可以更改数据类型。不幸的是,当我将相关字段从FLOAT 更改为DECIMAL 时,FLOAT 会自动再次返回。工作台由于某种原因不能选择DECIMAL。看这张照片。我可以从列表中选择 DECIMAL。然后当我将鼠标移到别处点击下一个空行时,我可以点击ApplyDECIMAL 消失,FLOAT 再次返回:

谁能告诉我这个问题的原因是什么?如何克服这个问题?

【问题讨论】:

  • 你希望你的小数有多大,有多少个小数字符?
  • 列值是这个 python 3.6.5 函数的结果,称为:time.process_time(),到目前为止我还没有看到它在规范中有多长。
  • 刚刚发现,原文件中的值为:0.003486746000000096。当我将它加载到FLOAT() 类型的表中时,它变成了:0.00348675。然后当我查询 MAX 时,它返回为:0.0034867459908127785。这真的很令人困惑。我希望在从文件中加载它们时完全存储这些数字。我需要它们在加载的所有阶段都完好无损,以查询MAX

标签: mysql database decimal mysql-workbench alter


【解决方案1】:

FLOATDOUBLE 以二进制编码,而不是十进制编码。因此,大多数小数在存储时无法准确表示。 (以 .5、.25、.75、.125 等结尾的数字)可以精确存储,因为它们涉及 2 的幂。

FLOAT 好到大约 7 位有效数字; DOUBLE 到 16 左右。

0.00348675              You stored this decimal
0.003486746000000096    After conversion to binary, then back to decimal
0.0034867459908127785   See below

(我怀疑你实际上存储了0.003486756。)

某些计算在DOUBLE 中完成;我怀疑MAX() 会这样做。这涉及将FLOAT 转换为DOUBLE在此转换中没有任何损失

好的,解释完我有点不知所措了。

我只想说 -- 每当使用 FLOATDOUBLE 时,请注意算术和显示都有这样的怪癖。

在某些情况下,MySQL 会尝试使用DECIMAL 来避免此类问题。我会猜测这在某种程度上涉及到,因为上面的中间数字有大约 14 个有效数字,而不是 16,这意味着涉及到 DOUBLE 以外的其他东西——也许DECIMAL(..., 16)。注意:这是小数位,与显着digits_不同。

如果您想进一步研究,请在http://bugs.mysql.com 提交的错误中提供一个简短的测试用例,并在此处发布类似的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2014-03-01
    • 2017-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    相关资源
    最近更新 更多