使用Qt自带的数据库函数QSqlQuery读取大数数字时,精度丢失的问题

数据库中存在一个字段NODE,该字段的类型是:NUMERIC(20,0)。

使用Qt的QSqlQuery从数据库读取该数字时,总是发生数据精度丢失的错误。

QSqlQuery query;
// 执行查询...

while (query.next()) {
    QString node_str = query.value(0).toString();

    //...
}

刚开始以为是类型转换的问题,后来发现QSqlQuery::value()这个成员是QVariant类型的。

使用qDebug()打印出来结果如下:

Qvariant(double,2.421e+18)

原因找到了,Qt从数据库读取该大数数字时,默认使用了double类型存储。但是double类型的只支持15-16位的精度,但是我们数据库的NODE字段却是19位,所以后三位的数字发生了精度丢失。

技术力有限,不知道该如何修改从默认使用double到long类型。即使query.value(0).toLong()也不行。猜测是qt底层的代码有问题导致的。

所以我想到的两张解决办法:

1.简单粗暴的将数据库这个字段改为varchar类型。

但是数据库的字段一开始设计好后,后续修改牵一发而动全身,如果项目复杂且庞大,建议采用2方法。

2.在拼接sql语句时,将NODE字段转换为char类型,这是从数据库的返回结果层面修改。不影响任何其他的部分。

sql << "SELECT *, CAST(NODE AS CHAR) AS NODE_STR FROM table;" << endl;

//如果执行报错:字符串截断,在char中添加你需要的字符串长度,笔者这里数据长度固定19,所以用20

sql << "SELECT *, CAST(NODE AS CHAR(20)) AS NODE_STR FROM table;" << endl;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值