【问题标题】:String to float conversion and formatting字符串到浮点数的转换和格式化
【发布时间】:2013-08-31 06:07:46
【问题描述】:

目前我有这样的东西

float a = SomeQString.toFloat(); //QString has 2.37

现在浮点数是 2.3690000031..

我想要的是 2.3700000000.. 有什么建议可以让我做到这一点吗?另外为什么我得到 2.369 而不是 2.37?

【问题讨论】:

  • @MitchWheat:四舍五入正是结果不是 2.370000 的原因。它四舍五入到最接近的可表示float

标签: c++ qt qtcore


【解决方案1】:

(已经被询问和解释了很多次。)不可能在float 中获得2.37。在double 中无法获得2.37。不可能以任何 IEEE-754 样式的二进制浮点格式获得 2.372.37 不能以这种二进制浮点格式精确表示。

阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic

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

【讨论】:

  • 我同意。浮点数的四舍五入是数学运算。
  • 我不想得到 2.37 我想要 2.3700000 转换搞乱了我的价​​值观。也感谢您重新表述您的答案
  • @MistyD:好吧,请注意它不会是2.370000。它将是2.370000358... 或类似的东西。很有可能2.369... 比其他替代2.370000358... 更接近您的原始2.37。这就是选择2.369... 的原因。这实际上是有道理的。
  • 2.37f,最接近 2.37 的 float 正好是 2.36999988555908203125。之后的下一个浮点数是2.3700001239776611328125。如果任何这些值都不满足 OP,则 OP 必须使用 float 以外的其他类型。
  • @Pascal Cuoq:显然toFloat 转换算法失去了一些精度(不足为奇)。请注意,它仍然恰好是 2.36999... 而不是 OP 预期的 2.370000...
【解决方案2】:
#include <string>
#include <sstream>

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

    return 0;
}

【讨论】:

    【解决方案3】:

    如果你坚持使用 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 和 Qt 5 运行以下命令(或者如果您有不同的场景,则使用类似的命令):

    命令:g++ -I/usr/include/qt -I/usr/include/qt/QtCore -lQt5Core -fPIC main.cpp &amp;&amp; ./a.out

    输出:2.37

    但是,您不需要 QString 来执行此操作。请参阅下面的代码,它按预期生成输出 2.37

    #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;
    }
    

    例如使用 gcc 运行以下命令(或者如果您有不同的场景,则使用类似的命令):

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

    输出:2.37

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-03
      • 1970-01-01
      • 2019-06-20
      • 1970-01-01
      • 2019-06-22
      • 2016-06-14
      • 2011-11-25
      • 1970-01-01
      相关资源
      最近更新 更多