查看完整版本: [-- 如何将 9.975 正确地保留两位小数 --]

QTCN开发网 -> Qt基础编程 -> 如何将 9.975 正确地保留两位小数 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

mengkun 2020-09-29 10:20

如何将 9.975 正确地保留两位小数

测试用例:

  1. QString str;
        double val = 9.975;
        qDebug() << QString::number(val, 'f', 2);
        qDebug() << str.setNum(val, 'f', 2);
        qDebug() << QString::asprintf("%.2f", val);
        qDebug() << str.sprintf("%.2f", val);

以上四种小数位数保留方法输出的结果都是 9.97……这个结果既不是四舍五入,也不是四舍六入。不知道为什么会这样求大神指点!


uidab 2020-09-29 10:22
+ 0.05
或者

qFloor :向下取整、qCeil:向上取整

mengkun 2020-09-29 10:33
uidab:+ 0.05
或者
qFloor :向下取整、qCeil:向上取整 (2020-09-29 10:22) 

谢谢!目前是这样解决的。但为什么会出现这种现象呢?是 QT 的 BUG 吗?

dbzhang800 2020-09-29 21:16
注意:

9.975  <  9.975f

如果你写成后者,结果会是 9.98

mengkun 2020-09-30 08:36
dbzhang800:
注意:
9.975  <  9.975f
如果你写成后者,结果会是 9.98


大佬您好,我测试了两种情况:

情形一:
[attachment=21935]

输出结果是  9.97,9.98,9.13,9.13

情形二:
[attachment=21936]

输出结果是:9.98,9.98,9.13,9.14


这两种情况的小数位数保留方式似乎完全没有规律可言。QT 里面到底是怎样处理这个小数位数的保留的呢?怎样让它变得有规律呢?(遵循四舍五入也好,四舍六入五留双也行)

snolkmg 2020-09-30 09:20
我一般是先乘以相应的倍数,再用qRound,再除以相应的倍数,比如这样:
qRound(9.975 * 100) / 100.0

dbzhang800 2020-09-30 09:35
mengkun:大佬您好,我测试了两种情况:
情形一:
....... (2020-09-30 08:36) 

这个Qt没有关系,和 浮点数在计算机中的表示方式有关。


绝大多数的小数,在计算机中无法用二进制精确表示。只能近似表示。而float和double只是有效位数不同。

比如10进制下用四舍五入的方式记录pi,你觉得保留7位小数和14小数时,二者大小关系如何?



mengkun 2020-09-30 09:42
dbzhang800:这个Qt没有关系,和 浮点数在计算机中的表示方式有关。
绝大多数的小数,在计算机中无法用二进制精确表示。只能近似表示。而float和double只是有效位数不同。
....... (2020-09-30 09:35) 

谢谢解惑!

angelus 2020-09-30 10:53
Qt库里缺少decmal这样的类型,不然计算和保留截断就可以方便了

littlebee 2020-10-11 15:36
QString::number(val,'g',2);


查看完整版本: [-- 如何将 9.975 正确地保留两位小数 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled