C++精度问题

Issues with C++ Precision

本文关键字:问题 精度 C++      更新时间:2023-10-16

我看到许多帖子谈到我们如何在C++中以给定的精度显示数字,但我想知道是否有办法显示非重复出现的数字,例如 x.0 和 setprecision 方法指定的宽度重复数字?

如果您事先知道要打印的数字是否显示重复的小数扩展,那么您可以简单地发出如下语句:

if is_recurring:
    print using expanded format
else
    print using fixed format

我想你事先不知道。一般来说,计算机也无法知道它。

它将如何测试几个小数(如果使用双精度,则约为 15)是否表示重复的小数?

此外,您想如何打印它?以经典为例:

3227 / 555 = 5.814414414414414

我应该如何打印?喜欢这个?

5.8144

还是那样?

5.8144
   ***

一般来说,这似乎是一个非常难以解决的问题。

听起来你真正想要的是修剪尾随零。机器不知道一个数字是否真的是一个"循环数",这只是一个有理数的花哨名称,其分母在数值基数上相对素数,因为浮点数学不是基于有理数的。

正如 Adam 所提到的,默认输出样式已经是省略尾随零。这与数学没有太大关系;它只是从字符串末尾删除字符。

就标准而言,ios_base::fixedios_base::scientific标志决定了定性格式。如果两者都未设置,则输出等效于 printf%g格式说明符。

man printf

随零将从结果的小数部分删除;仅当小数点后跟至少一位数字时,才会显示小数点。

尽管有上述规则,但要在最后获得.0,您必须执行诸如打印到临时字符串之类的操作,在它搜索小数点,如果未找到fixed则以模式重试。