代码之家  ›  专栏  ›  技术社区  ›  NeaÅ£u Ovidiu Gabriel

QString:最多2位小数,不带尾随零

  •  24
  • NeaÅ£u Ovidiu Gabriel  · 技术社区  · 10 年前

    我有这样一个部门:

    number / 1000.0
    

    有时它会给出96.0000000001这样的答案,有时该部门会按照预期工作。

    我想将我的数字限制在最多两个小数点后的位置,并且没有尾随零。

    如果是 96.5500000001 它应该显示 96.55 .

    如果是 96.4000000001 它应该显示 96.4

    可以用这种方式格式化字符串吗?

    我已经检查了文档,它提供了“f”参数来指定小数位数,但这样就保留了后面的零。 这是我尝试过的:

    QString::number(number / 1000.0, 'f', 2)
    

    但这给了我 96.4000000001 --> 96.40 而不是 96.4

    有什么解决办法吗?如何以这种方式格式化?

    3 回复  |  直到 10 年前
        1
  •  27
  •   AndreM96 artem    2 年前

    这个 documentation 非常清楚你应该做什么:

    精度也用参数格式指定。对于“e”、“e”和“f”格式,精度表示小数点后的位数。对于“g”和“g”格式,精度表示最大有效位数(省略尾随零)。

    因此,请使用“g”或“g”格式。

    主.cpp

    #include <QString>
    #include <QDebug>
    
    int main()
    {
        qDebug() << QString::number(96400.0000001 / 1000.0, 'g', 5);
        qDebug() << QString::number(96550.0000001 / 1000.0, 'G', 5);
        return 0;
    }
    

    主.pro

    TEMPLATE = app
    TARGET = main
    QT = core
    SOURCES += main.cpp
    

    生成并运行

    qmake && make && ./main
    

    输出

    "96.4"
    "96.55"
    
        2
  •  4
  •   Sideways S    4 年前

    这将始终以固定(非科学)表示法返回格式化的数字,并且非常有效:

    QString variableFormat(qreal n) { // assumes max precision of 2
        int i = rint(n * 100.0);
        if (i % 100)
            return QString::number(n, 'f', i % 10 ? 2 : 1);
        else
            return QString::number(i / 100);
    }
    
        3
  •  2
  •   l3enQ    2 年前

    使用 QString::number 同时带有“f”和“g”。首先,使用 toDouble() “f”的输出;然后使用 QString::number 使用默认参数或类似的“g”。

    QString::number(QString::number(number / 1000.0, 'f', 2).toDouble(), 'g', 10);