double精度导致tidb多次执行结果不一致

为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:
【 TiDB 使用环境】
报表查询

【概述】 场景 + 问题概述
一个表里的数据多次执行,结果不一致
CREATE TABLE test.test_no_same (
stock_qty double(16,4) DEFAULT ‘0.0000’ COMMENT ‘库存数量’,
reserved_qty double(16,4) DEFAULT ‘0.0000’ COMMENT ‘预留数量’,
purchase_price double(18,6) DEFAULT NULL COMMENT ‘进价’,
sale_price double(16,6) NOT NULL COMMENT ‘零售价’
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;



初步验证应该是double精度处理问题,字段类型改为decimal没有问题
【TiDB 版本】
5.7.25-TiDB-v5.1.0

【应用软件及版本】

已经验证是double精度问题了么?

是的,验证过了

您好,这个问题再哪个版本解决了吗?线上报表核对数据基本都会差1-2分钱,问题还是比较严重的

DOUBLE 数据类型存储近似值。对于货币之类的精确值,建议使用 DECIMAL 类型
https://docs.pingcap.com/zh/tidb/stable/data-type-numeric#double-类型

主要是现在表数据直接通过dm由mysql同步过来的。mysql里如果把所有double改为decimal工作量太大。
业务现在没有问题的,所有业务那边也不愿意去改

因为涉及到钱的还是建议decimal比较安全一点,如果实在不好改的话,这里想到两种解决办法
一,试着把tidb换成decimal,看同步是否还能成功(请问用什么同步的)
二、查询语句使用cast做显示转换

在 tidb 查询的时候数据有没有变化,直接在 mysql 中查询也会出现这种情况么

dm同步的。部分重要的SQL已经显示转换,是可以的,不过报表太多了,还有大部分没有改。还有些报表是组装的,没法手动调整

一直变,每次查询结果都不一样。mysql没有出现类似情况

拷贝一个临时表,在静态数据基础上查询呢

具体需怎么做?

create table test.test_no_same_bak like test_no_same;
insert into test_no_same_bak select * from test_no_same;

表挺多的,要实时更新,这种临时静态表适用我们的场景