【发布时间】: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