我创建了一个带有 FLOAT
键入列。但是,当我查询列的 MAX
, MIN
, AVG
值我得到不准确的数字,返回的值大于表中实际存储的值。例如,这是表中的实际最大值:0.00348675。不知怎么的, MAX
返回:0.0034867459908127785
不准确的原因是选择不当 FLOAT
作为类型。因此,我想将列类型更改为 DECIMAL.
我用 mysql-workbench
在ubuntu 18中。当我右键单击表并选择 Alter Table
我可以更改数据类型。不幸的是,当我将相关字段从 FLOAT
至 DECIMAL
, FLOAT
再次自动返回。工作台无法选择 DECIMAL
因为某种原因。看这张照片。我可以从列表中选择小数点。然后当我把鼠标移到别处去点击下一个空行时,我就可以点击了 Apply
,的 DECIMAL
消失 FLOAT
再次返回:
有人能告诉我发生这件事的原因吗?如何克服这个问题?
1条答案
按热度按时间a11xaf1n1#
FLOAT
以及DOUBLE
是用二进制编码的,而不是十进制编码的。因此,大多数小数在存储时无法准确表示(以.5、.25、.75、.125等结尾的数字可以精确存储,因为它们涉及2的幂。FLOAT
好到大约7位有效数字;DOUBLE
到16岁左右。(我怀疑你真的
0.003486756
.)某些计算是在
DOUBLE
; 我怀疑MAX()
是这样的。包括转换FLOAT
至DOUBLE
. 在这个转换过程中没有任何损失。好吧,我没法解释清楚。
只需说一句——无论何时使用
FLOAT
或者DOUBLE
,注意算术和显示有这样的怪癖。有些情况下,mysql试图通过使用
DECIMAL
. 我猜这是因为上面的中间数字有14位有效数字,而不是16位,这意味着DOUBLE
可能牵涉其中DECIMAL(..., 16)
. 注:这是小数位,不同于有效数位。如果您想进一步了解这一点,请在提交的bug中提供一个简短的测试用例http://bugs.mysql.com and 把喜欢的贴在这里。