C++ 字符串到浮点的转换和格式设置

C++ 字符串到浮点的转换和格式设置,c++,qt,qtcore,C++,Qt,Qtcore,现在我有这样的东西 float a = SomeQString.toFloat(); //QString has 2.37 现在浮点数是2.3690000031 我想要的是237亿。。有没有关于我怎么做的建议?还有为什么我得到的是2.369而不是2.37 #包括 #include <string> #include <sstream> int main(void) { std::string QString = "2.37"; std::istring

现在我有这样的东西

float a = SomeQString.toFloat(); //QString has 2.37
现在浮点数是2.3690000031

我想要的是237亿。。有没有关于我怎么做的建议?还有为什么我得到的是2.369而不是2.37

#包括
#include <string>
#include <sstream>

int main(void)
{
    std::string QString = "2.37";
    std::istringstream StrToFloat(QString );
    float floatVar;
    StrToFloat >> floatVar;

    return 0;
}
#包括 内部主(空) { std::string QString=“2.37”; std::istringstream strotFloat(QString); 浮动var; StrToFloat>>floatVar; 返回0; }
(已经被询问和解释了很多次。)不可能在
浮动中获得
2.37
。在
double
中无法获得
2.37
。无法以任何IEEE-754样式的二进制浮点格式获取
2.37
2.37
不能用这种二进制浮点格式精确表示

阅读


“获取”
2.37
的一个可行方法实际上是将
2.369…
存储在
float
中(这是您已经做过的),然后在需要生成十进制表示时将其四舍五入到
2.37
,即,当您必须向用户呈现/输出值时。

如果您坚持使用Qt,这是适合您的代码:

#include <QString>
#include <QTextStream>
#include <QDebug>

using namespace std;

int main()
{
    QString floatString = "2.37";
    QTextStream floatTextStream(&floatString);
    float f;
    floatTextStream >> f;
    qDebug() << f;

    return 0;
} 
例如,使用gcc运行以下命令(如果您有不同的场景,也可以运行类似的命令):

命令:
g++main.cpp&&./a.out


输出:
2.37

我同意。浮点数的四舍五入是数学上的。我不想得到2.37,我想要2.3700000。转换把我的值弄乱了。也谢谢你重新表述你的观点answer@MistyD:好的,请注意它不会是
2.370000
。它将是
2.370000358…
或类似的东西。而且很有可能,
2.369…
比另一个
2.370000358…
更接近您原来的
2.37
。这就是为什么选择了
2.369…
。这实际上是有道理的。
2.37f
,最接近2.37的
float
正好是
2.36999988555908203125
。之后的下一个浮点数是
2.37000012397767611328125
。如果OP不满足这些值中的任何一个,OP必须使用除
float
@Pascal Cuoq之外的另一种类型:显然
toFloat
转换算法会失去一些精度(这并不奇怪)。请注意,它仍然碰巧是
2.36999…
,而不是OP@MitchWheat所期望的
2.370000…
。@四舍五入正是结果不是2.370000的原因。它四舍五入到最接近的可表示的
float
#include <string>
#include <sstream>
#include <iostream>

using namespace std;

int main()
{
    string floatString = "2.37";
    istringstream floatStringStream(floatString);
    float f;
    floatStringStream >> f;
    cout << f;

    return 0;
}