无法在 mysql-workbench 中将 table 字段从浮点数更改为十进制

Can't alter table field from float to decimal in mysql-workbench

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

不准确是由于选择了 FLOAT 作为类型。因此,我想将列类型更改为 DECIMAL.

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

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

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,这意味着除了 [=涉及 12=]——也许是 DECIMAL(..., 16)。注意:那是小数位,区别于显着位数_.

如果您想进一步研究,请在 http://bugs.mysql.com 和 post 中提交的错误中提供一个简短的测试用例。