2

我看到了一些关于我们如何在 C++ 中显示具有给定精度的数字的帖子,但我想知道是否有一种方法可以显示非重复数字,例如 x.0 和由 setprecision 指定的宽度重复数字方法?

4

2 回答 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::fixedios_base::scientific标志确定定性格式。如果两者都没有设置,则输出等同于 的%g格式说明符printf

man printf

从结果的小数部分中删除尾随零;只有在小数点后跟至少一位数字时才会出现小数点。

尽管有上述规则,要在最后得到 a .0,您必须执行一些操作,例如打印到临时字符串,搜索小数点,fixed如果找不到,则在模式下重试。

于 2013-10-12T03:52:07.023 回答