【发布时间】:2017-05-04 22:29:09
【问题描述】:
我正在尝试在 C++ 中打印小数点后最多 4 位数字(使用流)。因此,如果数字不需要小数点后 4 位,我希望它只使用它实际需要的小数位数。
例子:
1.12345 -> 1.1234
1.0 -> 1
1.12 -> 1.12
1.12345789 -> 1.1234
123.123 -> 123.123
123.123456 -> 123.1234
我尝试了std::setprecision(4),但它设置了有效位数并在测试用例中失败:
123.123456 gives 123.1
我也尝试将std::fixed 与std::setprecision(4) 一起提供,但即使不需要,也会给出固定的小数位数:
1.0 gives 1.0000
似乎std::defaultfloat 是我需要的,不是固定的也不是指数的。但它似乎没有适当地打印小数点后的位数,并且只有有效数字的选项。
【问题讨论】:
-
这需要自定义代码,处理要打印的值的 BCD 或字符串表示形式。请记住,因为浮点数的底层表示是二进制的,所以不一定有(比如)123.123 的精确二进制表示。如果您显示了足够多的小数位,
double x = 123.123; cout << x之类的内容可能会输出123.1230000001之类的内容。因此,我建议编写一个函数,将双精度转换为具有四个小数位的字符串,然后在返回字符串之前删除小数位后的所有尾随零。 -
您的示例与您的问题描述不符。查看这些示例,您更像是不希望超过 4 个小数,并且没有任何尾随零。这肯定与 4 位小数不一样。此外,正如 Simon 所指出的,鉴于 IEEE 浮点值表示的性质,您必须为短语 “需要一个数字” 的含义提供更好的规范。
-
所以你希望它只打印四位数字,除非它不打印四位数字?
-
我将其表述为“在小数点后最多打印 4 位数字,省略尾随零”。