无法在 mysql-workbench 中将 table 字段从浮点数更改为十进制
Can't alter table field from float to decimal in mysql-workbench
我创建了一个 table 和 FLOAT
类型的列。但是,我发现当我查询列的 MAX
、MIN
、AVG
值时,我得到的数字不准确,其中返回的值大于 [=41= 中实际存储的值].例如,这是 table 中的实际最大数:0.00348675。不知何故,MAX
returns 这个:0.0034867459908127785
不准确是由于选择了 FLOAT
作为类型。因此,我想将列类型更改为 DECIMAL.
我在Ubuntu中使用mysql-workbench
18.当我右击table并选择Alter Table
时,我可以更改数据类型。不幸的是,当我将相关字段从 FLOAT
更改为 DECIMAL
时,FLOAT
returns 会自动再次出现。 workbench 由于某种原因无法选择 DECIMAL
。看这张照片。我可以从列表中选择 DECIMAL。然后,当我将鼠标移到别处单击下一个空行时,我可以单击 Apply
,DECIMAL
消失并且 FLOAT
returns 再次:
谁能告诉我这个问题的原因是什么?如何克服这个问题?
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()
这样做。这涉及将 FLOAT
转换为 DOUBLE
。在此转换中没有任何损失。
好吧,我也懒得解释完了
我只想说 -- 无论何时使用 FLOAT
或 DOUBLE
,请注意算术和显示有这样的怪癖。
有些情况下 MySQL 试图通过使用 DECIMAL
来避免此类问题。我会 猜测 这在某种程度上涉及到这里,因为上面的中间数字有大约 14 有效数字 ,而不是 16,这意味着除了 [=涉及 12=]——也许是 DECIMAL(..., 16)
。注意:那是小数位,区别于显着位数_.
如果您想进一步研究,请在 http://bugs.mysql.com 和 post 中提交的错误中提供一个简短的测试用例。
我创建了一个 table 和 FLOAT
类型的列。但是,我发现当我查询列的 MAX
、MIN
、AVG
值时,我得到的数字不准确,其中返回的值大于 [=41= 中实际存储的值].例如,这是 table 中的实际最大数:0.00348675。不知何故,MAX
returns 这个:0.0034867459908127785
不准确是由于选择了 FLOAT
作为类型。因此,我想将列类型更改为 DECIMAL.
我在Ubuntu中使用mysql-workbench
18.当我右击table并选择Alter Table
时,我可以更改数据类型。不幸的是,当我将相关字段从 FLOAT
更改为 DECIMAL
时,FLOAT
returns 会自动再次出现。 workbench 由于某种原因无法选择 DECIMAL
。看这张照片。我可以从列表中选择 DECIMAL。然后,当我将鼠标移到别处单击下一个空行时,我可以单击 Apply
,DECIMAL
消失并且 FLOAT
returns 再次:
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()
这样做。这涉及将 FLOAT
转换为 DOUBLE
。在此转换中没有任何损失。
好吧,我也懒得解释完了
我只想说 -- 无论何时使用 FLOAT
或 DOUBLE
,请注意算术和显示有这样的怪癖。
有些情况下 MySQL 试图通过使用 DECIMAL
来避免此类问题。我会 猜测 这在某种程度上涉及到这里,因为上面的中间数字有大约 14 有效数字 ,而不是 16,这意味着除了 [=涉及 12=]——也许是 DECIMAL(..., 16)
。注意:那是小数位,区别于显着位数_.
如果您想进一步研究,请在 http://bugs.mysql.com 和 post 中提交的错误中提供一个简短的测试用例。