【问题标题】:mysql convert float to doublemysql 将浮点数转换为双精度数
【发布时间】:2015-05-04 07:41:55
【问题描述】:

需要更改表字段的类型(带数据)。 从浮点型到双精度型。 执行此操作的代码:

ALTER TABLE `my_table`
CHANGE COLUMN `my_value` `my_value` 
DOUBLE NULL DEFAULT NULL AFTER `id`;

但是我遇到了一个问题: 所有小数都变质了: 旧值 -> 新值:

129.8 -> 129.8000030517578
117.9 -> 117.9000015258789
99.2 -> 99.19999694824219

如何在不损坏数据的情况下更改字段类型?

【问题讨论】:

    标签: mysql double alter-table


    【解决方案1】:

    为了实现这一点,我这样做了:

    1 个变体: 先转换成VARCHAR(255):

    ALTER TABLE `my_table`
    CHANGE COLUMN `my_value` `my_value` 
    VARCHAR(255) NULL DEFAULT NULL AFTER `id`;
    

    秒转换成DOUBLE:

    ALTER TABLE `my_table`
    CHANGE COLUMN `my_value` `my_value` 
    DOUBLE NULL DEFAULT NULL AFTER `id`;
    

    2 变体: 先转换成DOUBLE(10,2):

    ALTER TABLE `my_table`
    CHANGE COLUMN `my_value` `my_value` 
    DOUBLE(10,2) NULL DEFAULT NULL AFTER `id`;
    

    秒转换成DOUBLE:

    ALTER TABLE `my_table`
    CHANGE COLUMN `my_value` `my_value` 
    DOUBLE NULL DEFAULT NULL AFTER `id`;
    

    会不会有什么问题?

    【讨论】:

      【解决方案2】:

      你不能。 FLOAT 和 DOUBLE 类型表示 近似 数值数据值。它们的存储方式可以包含范围广泛的数字(从非常大到非常小),但代价是有点不准确。 请参阅Floating point types 了解更多信息。

      如果您需要这种精度,请改用Fixed point types,例如 DECIMAL。

      【讨论】:

      【解决方案3】:

      试试这个:

      ALTER TABLE `my_table`
      CHANGE COLUMN `my_value` `my_value` 
      DOUBLE(10,2) NULL DEFAULT NULL AFTER `id`;
      

      【讨论】:

      • 好主意,但我不能限制小数部分
      【解决方案4】:

      试试这个:-

      ALTER TABLE `table`
      CHANGE COLUMN `my_value` `my_value`
      decimal(10,2) NULL DEFAULT NULL AFTER `id`;
      

      【讨论】:

      • 但是我不能限制小数部分
      猜你喜欢
      • 2015-06-12
      • 1970-01-01
      • 2018-04-26
      • 2018-08-09
      • 2011-11-22
      • 2014-01-30
      • 1970-01-01
      • 2014-05-29
      • 1970-01-01
      相关资源
      最近更新 更多