【问题标题】:c++ boost format float - how to specify that I do not want . and following zerosc++ boost format float - 如何指定我不想要的。并跟随零
【发布时间】:2013-07-19 19:05:38
【问题描述】:

我想使用boost::format 将浮点数转换为字符串。 以下是预期结果的几个示例:

0.5     -> "0.5"
0       -> "0"
1.00001 -> "1"
3.66    -> "3.7"

我正在使用

boost::format("%1$.1f")

它最有效,但是当我想要"0""1" 时,0 的结果是 "0.0"1.00001"1.0"

我需要改变什么来摆脱毫无意义的.0

【问题讨论】:

  • 这将打破其他精度必须为 1 的情况

标签: c++ boost floating-point formatting boost-format


【解决方案1】:

使用条件在两种格式之间进行选择。

boost::format(abs(x-floor(x+0.05)) < 0.1 ? "%1$.0f" : "%1$.1f")

【讨论】:

  • 这会做......或......如果为零,则向右修剪,如果是点,则向右修剪。我很惊讶没有办法在格式化表达式本身中指定这一点
  • 但是在这种情况下,0.95 将打印为 1 而不是 0.9,尽管它恰好是 0.94999999999999999555910790149937383830547332763671875
  • @aka.nice,这就是使用浮点的现实——没有什么是精确的,所以总会有一些极端情况。您可以进行简单而明显的转换为字符串并去掉尾随的.0,然后您就可以使用您的标准库版本中内置的任何舍入。
  • @MarkRansom 我只是想提醒一下,精心编写的 printf/scanf 排列正确。所以这个函数是低于 printf 的一个质量级别。例如,我想它会因为包含在 boost 中而被拒绝。当然,这个小的舍入误差对于大多数应用程序来说可能无关紧要,所以这个答案还不错。它的优点是简单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-27
  • 1970-01-01
  • 1970-01-01
  • 2019-11-12
  • 1970-01-01
  • 2021-02-25
相关资源
最近更新 更多