【问题标题】:Making printf do the right thing with floating point使 printf 用浮点做正确的事
【发布时间】:2013-04-10 23:31:57
【问题描述】:

我试图让 printf 用浮点数“做正确的事”,即:

  • 永远不会丢失信息,总是打印出精确值所需的尽可能多的小数

  • 不要打印一堆多余的尾随零

  • 如果输出会过大,请切换到科学计数法

%.20g 似乎做到了所有这些,但我还想得到一件事:

  • 如果值是整数,请打印尾随 '.0' 以表明它是具有整数值的浮点数,而不是整数类型的数字

有没有什么方法可以在不丢失前三个条件的情况下获得第四个条件?

【问题讨论】:

  • 这是关于 C printf 的吗?如果有,请考虑加C标签,或者对应的
  • 我认为您不能仅使用 printf 完美地捕获所有 4 个案例。您可以 printf 到一个虚拟变量,如果它缺少小数点,则在推送到实际字符串之前附加 '.0'。
  • @Pyrce 这可能是一个解决方案,问题在于正确处理所有边缘情况,例如对于像 1e100 这样打印的大整数是错误的;还有哪些我没有想到的边缘情况? - 等等,也许我可以将标准设为输出是否仅包含十进制数字,并且可能是前导减号。这将在边缘情况下安全地发挥作用。
  • 在我的书中,%a 是浮点数的正确选择。为了得到你想要的,你可能只是sprintf你的号码到一个缓冲区,如果还没有一个点,你可以在后面附加一个“.0”。
  • @rwallace 如果没有 '.',我可能只会附加一个 '.0'或 'e' 字符出现在原始输出中,因为它是一个更简单的逻辑。你的潜在输出受到 %f 和 %e 的限制,所以我认为你不会有其他极端情况。

标签: c floating-point printf


【解决方案1】:

看起来标志“#”至少会在末尾加上一个句点。试试%#.20g

# 标志例如记录在 here: “与 a、A、e、E、f、F、g 或 G 一起使用,即使后面没有数字,它也会强制写入的输出包含小数点。默认情况下,如果后面没有数字,则不会写入小数点。”

【讨论】:

  • 只给出他第四个标准的前半部分(缺少'0')
  • 确实会打印一个尾随小数点,但它也会返回打印大量冗余尾随零。
  • 我明白了。也许最简单的事情是,而不是使用 printf 来解决这个问题,而是自己检测一个整数(在 printf 输出中搜索一个句点),在这种情况下只需手动附加 .0
猜你喜欢
  • 2020-02-28
  • 2020-03-14
  • 2011-03-13
  • 1970-01-01
  • 2012-04-15
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
  • 1970-01-01
相关资源
最近更新 更多