TiDB v5.4.0 round()函数出现截断,而不是四舍五入

Bug 反馈
v5.4.0版本使用round函数对float类型的列保留小数位时,出现截断而非四舍五入,在4.0.2版本测试是成功的
【 TiDB 版本】
v5.4.0
【 Bug 的影响】
round()函数输出值出错
【可能的问题复现步骤】

create table t (id int primary key, value float);
insert into t value(1, 1616.625);
select round(value,2) from t where id=1;

【看到的非预期行为】

mysql> select round(value,2) from t where id=1;
+----------------+
| round(value,2) |
+----------------+
|        1616.62 |
+----------------+
1 row in set (0.00 sec)

【期望看到的行为】

mysql> select round(value,2) from t where id=1;
+----------------+
| round(value,2) |
+----------------+
|        1616.63 |
+----------------+
1 row in set (0.00 sec)

【相关组件及具体版本】

【其他背景信息或者截图】

如集群拓扑,系统和内核版本,应用 app 信息等;如果问题跟 SQL 有关,请提供 SQL 语句和相关表的 Schema 信息;如果节点日志存在关键报错,请提供相关节点的日志内容或文件;如果一些业务敏感信息不便提供,请留下联系方式,我们与您私下沟通。

请检查一下各个版本的兼容性差异化

直接改成DECIMAL 吧

这个应该是继承自MySQL的问题了~

应该就是这个问题,正常数据库也不应该用flaot类型

@有猫万事足 来自这位大佬的回答,已经提了issues
https://github.com/pingcap/tidb/issues/26993
d92c8b8e162868b0b50847a2865f19d

3 个赞

DECIMAL 试试

:joy:估计可能是历史原因导致的使用float,这点深有体会~

因为是在做4.0.2到5.4.0的数据迁移,迁移后使用sync_diff_inspector校验上下游的数据,由于sync_diff_inspector对float和double类型的数据使用round()函数保留6位和15位有效数字,导致上下游的数据校验失败,因为4.0.2使用round()函数会四舍五入 ,而5.4.0直接截断了

实际你这个例子我再mysql8上执行了一下
CREATE TABLE t_float (id INT PRIMARY KEY, VALUE FLOAT);
INSERT INTO t_float VALUE(1, 1616.625);
SELECT ROUND(VALUE,2) FROM t_float WHERE id=1;
表里的数据直接就被截断了。。。
image