• 3177阅读
  • 9回复

[提问]如何将 9.975 正确地保留两位小数 [复制链接]

上一主题 下一主题
离线mengkun
 

只看楼主 倒序阅读 楼主  发表于: 2020-09-29
回复本帖可获得10RMB金钱奖励!
每人最多可获奖1次,奖池剩余80RMB金钱 (中奖几率10%)
测试用例:

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

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

离线uidab

只看该作者 1楼 发表于: 2020-09-29
+ 0.05
或者

qFloor :向下取整、qCeil:向上取整
4条评分好评度+1贡献值+1金钱+1威望+1
mengkun 好评度 +1 感谢解答! 2020-09-30
mengkun 贡献值 +1 感谢解答! 2020-09-30
mengkun 威望 +1 感谢解答! 2020-09-30
mengkun 金钱 +1 感谢解答! 2020-09-30
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线mengkun

只看该作者 2楼 发表于: 2020-09-29
回 uidab 的帖子
uidab:+ 0.05
或者
qFloor :向下取整、qCeil:向上取整 (2020-09-29 10:22) 

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

只看该作者 3楼 发表于: 2020-09-29
注意:

9.975  <  9.975f

如果你写成后者,结果会是 9.98
4条评分好评度+1贡献值+1金钱+1威望+1
mengkun 好评度 +1 感谢解答! 2020-09-30
mengkun 贡献值 +1 感谢解答! 2020-09-30
mengkun 威望 +1 感谢解答! 2020-09-30
mengkun 金钱 +1 感谢解答! 2020-09-30
离线mengkun

只看该作者 4楼 发表于: 2020-09-30
回 dbzhang800 的帖子
dbzhang800:
注意:
9.975  <  9.975f
如果你写成后者,结果会是 9.98


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

情形一:


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

情形二:


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


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

只看该作者 5楼 发表于: 2020-09-30
我一般是先乘以相应的倍数,再用qRound,再除以相应的倍数,比如这样:
qRound(9.975 * 100) / 100.0
离线dbzhang800

只看该作者 6楼 发表于: 2020-09-30
回 mengkun 的帖子
mengkun:大佬您好,我测试了两种情况:
情形一:
....... (2020-09-30 08:36) 

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


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

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


离线mengkun

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

谢谢解惑!
离线angelus

只看该作者 8楼 发表于: 2020-09-30
Qt库里缺少decmal这样的类型,不然计算和保留截断就可以方便了
离线littlebee

只看该作者 9楼 发表于: 2020-10-11
QString::number(val,'g',2);
快速回复
限100 字节
 
上一个 下一个