您的位置:首页 > 其它

qDebug()浮点输出问题

2018-03-31 15:36 330 查看

概要

在使用Qt时,通过
qDebug()
输出浮点数时有机会遇到一个细微错误。 问题在于显示的可能并不完整。
std::cout
有相同的问题。

情况可能发生在以下情况:

您有一个
QString
对象,它包含一定数量的
8564.26495574
,我们使用
toDouble()
方法将其转换为浮点数,然后用输出
qDebug()
检查结果,但是运气不好,输出不正确。

QString str("8564.26495574");
qDebug() << str.toDouble();

// 输出 -> 8564.26


但实际上我们有绝对正确的数字,也就是从字符串中得到的数字
8564.26495574
,但qDebug()显示了舍入结果。

如果您尝试为
qDebug()
使用
double
,则会观察到同样的情况。

double a = 8564.26495574;
qDebug() << a;

// 输出 -> 8564.26


使用
bool
变量确保将数字从
QString
转换为
double
时没有发生错误,该变量是作为
toDouble()
方法参数传递的指针。

QString str("8564.26495574");
bool ok = false;
qDebug() << str.toDouble(&ok);
qDebug() << ok;

// 我们将得到如下输出
// 8564.26
// true - 也就是说转换成功,那么问题不在转换这步。


解决方法

为了做出正确的输出,我们必须使用
QString::arg()
方法来指示格式化和精确化的类型。

QString str("8564.26495574");

double a = 8564.26495574;
double b = str.toDouble();

qDebug() << QString("%1").arg(a, 0, 'f', 5);
qDebug() << QString("%1").arg(a, 0, 'g', 5);
qDebug() << QString("%1").arg(a, 0, 'e', 10);
qDebug() << QString("%1").arg(a, 0, 'g', 30);

qDebug() << QString("%1").arg(b, 0, 'f', 5);
qDebug() << QString("%1").arg(b, 0, 'g', 5);
qDebug() << QString("%1").arg(b, 0, 'e', 10);
qDebug() << QString("%1").arg(b, 0, 'g', 30);


我们将得到如下输出

"8564.26496"
"8564.3"
"8.5642649557e+3"
"8564.26495574000000488013029099"

"8564.26496"
"8564.3"
"8.5642649557e+3"
"8564.26495574000000488013029099"


在这两种情况下,我们都可以得到与这里相同的结果,并且这里的数字是相同的。

关于格式化的参数(Qt文档中有详细介绍):

eformat as [-]9.9e[+|-]999
Eformat as [-]9.9E[+|-]999
fformat as [-]9.9
guse e or f format, whichever is the most concise
Guse E or f format, whichever is the most concise
正如您在输出中看到的那样,输出8564.26495574000000488013029099有点不正确。 这与计算机背后如何存储浮点数有关。任何计算机中位数的容量都是有限的,因此在最后一位小数位发生四舍五入,这会导致出现此现象。 精确计算时应考虑这一点。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: