在Qt5中从std :: stod()和QString :: toDouble()获取不同的值

时间:2016-06-10 12:52:54

标签: qt c++11 floating-point double

我启动了一个Qt项目并将其链接到我编写的一些C ++代码来解析文件。这段代码使用std :: stod()来解析double值,并且在普通的c ++项目中工作正常,但是当与Qt应用程序一起使用时,std :: stod()只返回数字的整数部分。

我编写并运行了一些测试代码,一个用g ++ 6.1编译,另一个用qmake 5.6和相同的g ++编写。结果与我的项目结果相同。

使用g ++编译的代码:

#include <iostream>

int main(int argc, char ** argv)
{
  const std::string number("3.14");
  double dbl = std::stod(number);

  std::cout << dbl << '\n'; // 3.14

  return 0;
}

它显示了良好的价值:3.14

用Qt编译的代码:

#include <QCoreApplication>
#include <QDebug>
#include <iostream>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    const std::string snumber("3.14");
    const QString qnumber = QString::fromStdString("3.14");

    double std_d = std::stod(snumber);
    double qt_d  = qnumber.toDouble();

    qDebug() << std_d << qt_d;                 // 3 3.14
    std::cout << std_d << ' ' << qt_d << '\n'; // 3 3.14

    return a.exec();
}

你能告诉我为什么std :: stod()表现得像这样吗?

1 个答案:

答案 0 :(得分:5)

因为std::stod 被破坏而无法修复并且应该在地狱中燃烧是以std::strtod实现的,它根据当前区域设置解释双精度 。 QString总是使用C语言环境(使用QLocale进行特定于语言环境的转换)。

创建QCoreApplication实例会调用setlocale(LC_ALL, ""),根据环境设置进程的语言环境,从而改变std::stod行为。