当前位置: 首页 > 科技观察

MySQL中浮点数转字符问题

时间:2023-03-16 12:17:41 科技观察

一个问题描述今天遇到一个需要刷新数据的问题,就是修改商品的权重(字段类型为float)。修改商品重量后,需要记录在日志表中(字段类型为varchar),表结构如下:临时刷数据表:CREATETABLE`temp_170830`(`id`int(10)unsignedNOTNULLAUTO_INCREMENTCOMMENT'主键ID',`goods_sn`varchar(255)NOTNULLDEFAULT''COMMENT'产品代码',`goods_weight`float(9,4)NOTNULLDEFAULT'0.0000'COMMENT'产品重量',`actual_weight`float(9,4)NOTNULLDEFAULT'0.0000'COMMENT'实际重量',`new_actual_weight`float(9,4)NOTNULLDEFAULT'0.0000'COMMENT'新实际重量',`create_user`varchar(30)NOTNULLDEFAULT''COMMENT'创建者',PRIMARYKEY(`id`),KEY`idx_goods_sn`(`goods_sn`))ENGINE=InnoDBAUTO_INCREMENT=8192DEFAULTCHARSET=utf8COMMENT='临时刷权重表';日志表:CREATETABLE`log_weight`(`id`int(10)unsignedNOTNULLAUTO_INCREMENTCOMMENT'主键ID',`goods_sn`varchar(50)NOTNULLDEFAULT''COMMENT'产品代码',`which_col`varchar(100)NOTNULLDEFAULT''COMMENT'修改字段',`old_value`varchar(50)NOTNULLDEFAULT'0.00'COMMENT'更新前的值',`new_value`varchar(50)NOTNULLDEFAULT'0.00'COMMENT'更新后的值',`update_user`varchar(100)NOTNULLDEFAULT''COMMENT'创建者',`update_time`datetimeNOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP,`wh_update_time`timestampNOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMPCOMMENT'记录修改时间',PRIMARYKEY(`id`),KEY`idx_goods_sn`(`goods_sn`),KEY`idx_update_user`(`update_user`),KEY`wh_update_time`(`wh_update_time`))ENGINE=InnoDBAUTO_INCREMENT=14601620DEFAULTCHARSET=utf8COMMENT='权重修改日志';如上建表所示,我需要将temp_170830表的actual_weight和new_actual_weight字段分别刷入log_weight表的old_value和new_value字段。SQL语句如下:INSERTINTOlog_weight(goods_sn,which_col,old_value,new_value,update_user)SELECTgoods_sn,'actual_weight',actual_weight,new_actual_weight,create_userFROMtemp_170830;我还以为到这里就搞定了,毕竟我只是插入了一些日志记录而已。后来为了简单查看,发现数据有问题,如下图所示:临时表数据截图:日志表数据截图:通过对比可以发现插入的日志记录数据有很多无缘无故地落后于小数点。数据类型取之不尽,用之不竭。转为varchar时,会带出后面的。暂时不是很确定。后续确认后,再补充。然后我临时找了一个concat方法来转换varchar,并调整如下:t,''),concat(new_actual_weight,''),create_userFROMtemp_170830;成功解决日志记录问题如下:1在记录价格和重量数值字段时,尽量不要使用浮点型!!!,有很多浮点数(比如浮点型不能判断为相等!!!),最好是使用int整型。当业务需要显示小数时,读取它并除以相应的位数。比如99.98元要存为9998,读出时用9998/100显示。2float转varchar时,应先用concat函数将float转varchar,再存入varchar字段。