我看到了一些关于我们如何在 C++ 中显示具有给定精度的数字的帖子,但我想知道是否有一种方法可以显示非重复数字,例如 x.0 和由 setprecision 指定的宽度重复数字方法?
问问题
158 次
2 回答
3
如果您事先知道要打印的数字是否表现出重复的小数扩展,那么您可以简单地发出如下语句:
if is_recurring:
print using expanded format
else
print using fixed format
我想你事先并不知道。通常,计算机也无法知道它。
它如何测试几个小数(如果使用双精度,大约为 15)是否代表循环小数?
此外,您想如何打印它?举个经典例子:
3227 / 555 = 5.814414414414414
我应该如何打印?像这样?
5.8144
还是那样?
5.8144
***
一般来说,这似乎是一个非常难以解决的问题。
于 2013-10-12T03:42:57.223 回答
1
听起来您真正想要的是修剪尾随零。机器不知道一个数字是否真的是一个“循环数”,这只是一个有理数的花哨名称,它的分母与数字基数相对质数,因为浮点数学不是基于有理数。
正如亚当所提到的,默认输出样式已经是省略尾随零。这与数学没有太大关系。它只是从字符串末尾删除字符。
就标准而言,ios_base::fixed
和ios_base::scientific
标志确定定性格式。如果两者都没有设置,则输出等同于 的%g
格式说明符printf
。
据man printf
,
从结果的小数部分中删除尾随零;只有在小数点后跟至少一位数字时才会出现小数点。
尽管有上述规则,要在最后得到 a .0
,您必须执行一些操作,例如打印到临时字符串,搜索小数点,fixed
如果找不到,则在模式下重试。
于 2013-10-12T03:52:07.023 回答