不能在mysql工作台中将表字段从float改为decimal

niwlg2el  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(332)

我创建了一个带有 FLOAT 键入列。但是,当我查询列的 MAX , MIN , AVG 值我得到不准确的数字,返回的值大于表中实际存储的值。例如,这是表中的实际最大值:0.00348675。不知怎么的, MAX 返回:0.0034867459908127785
不准确的原因是选择不当 FLOAT 作为类型。因此,我想将列类型更改为 DECIMAL. 我用 mysql-workbench 在ubuntu 18中。当我右键单击表并选择 Alter Table 我可以更改数据类型。不幸的是,当我将相关字段从 FLOATDECIMAL , FLOAT 再次自动返回。工作台无法选择 DECIMAL 因为某种原因。看这张照片。我可以从列表中选择小数点。然后当我把鼠标移到别处去点击下一个空行时,我就可以点击了 Apply ,的 DECIMAL 消失 FLOAT 再次返回:

有人能告诉我发生这件事的原因吗?如何克服这个问题?

a11xaf1n

a11xaf1n1#

FLOAT 以及 DOUBLE 是用二进制编码的,而不是十进制编码的。因此,大多数小数在存储时无法准确表示(以.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() 是这样的。包括转换 FLOATDOUBLE . 在这个转换过程中没有任何损失。
好吧,我没法解释清楚。
只需说一句——无论何时使用 FLOAT 或者 DOUBLE ,注意算术和显示有这样的怪癖。
有些情况下,mysql试图通过使用 DECIMAL . 我猜这是因为上面的中间数字有14位有效数字,而不是16位,这意味着 DOUBLE 可能牵涉其中 DECIMAL(..., 16) . 注:这是小数位,不同于有效数位。
如果您想进一步了解这一点,请在提交的bug中提供一个简短的测试用例http://bugs.mysql.com and 把喜欢的贴在这里。

相关问题