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

Nea*_*iel 15 c++ precision qstring qt qtcore

我有这样一个部门:

number / 1000.0
Run Code Online (Sandbox Code Playgroud)

有时它会给出96.0000000001这样的答案,有时候除法会按预期运行.

我想将我的数字限制为最多两个小数位并且没有尾随零.

如果它是96.5500000001它应该显示96.55.

如果是96.4000000001则应显示96.4

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

我检查了文档,它提供了'f'参数来指定小数位数,但这样尾随的零保持不变.这是我尝试过的:

QString::number(number / 1000.0, 'f', 2)
Run Code Online (Sandbox Code Playgroud)

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

有解决方案吗 我怎样才能以这种方式格式化?

lpa*_*app 16

文件是你应该做的事情非常清楚:

还使用参数格式指定精度.对于'e','E'和'f'格式,精度表示小数点后的位数.对于'g'和'G'格式,精度表示最大有效位数(省略尾随零).

因此,请使用"g"或"G"格式.

main.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;
}
Run Code Online (Sandbox Code Playgroud)

main.pro

TEMPLATE = app
TARGET = main
QT = core
SOURCES += main.cpp
Run Code Online (Sandbox Code Playgroud)

构建并运行

qmake && make && ./main
Run Code Online (Sandbox Code Playgroud)

产量

"96.4"
"96.55"
Run Code Online (Sandbox Code Playgroud)

  • 我感谢您承认剩余的问题,但只有在该问题解决之前,问题才得到解决。这个答案的问题在于,“g”选项可以为您的许多值留下科学记数法,具体取决于您的值。如果您想强制使用可变小数的固定表示法,则需要进行不同的数学运算并使用具有可变精度值的“f”选项。如果是“N.00”,您还需要转换为 int 我刚刚在新答案中发布了完整的解决方案。 (5认同)
  • 在您的示例中,如果我执行 QString::number(1234.000001 / 1000.0, 'g', 5) 它将返回 1.234,即三位小数。 (3认同)
  • 当然,所以:1)将所有内容截断到最大两位数 - 就像你的问题已经可以了,除了toDouble()调用之外 - 然后运行我的解决方案,你会得到或多或少你想要的角落情况.不可否认,遗憾的是,你仍然会有简洁的格式.如果这有问题,请再次调用Double()并使用另一种格式与现在切碎的数字.:) (2认同)

jam*_*ess 5

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

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);
}
Run Code Online (Sandbox Code Playgroud)