2012-08-15 159 views
0

我有一个包含在每个像线的一些值的文本文件:为什么setPrecision不会自动使用最小可用精度?

xxx.xxxxxx 

我读每一行和将它们转换使用strod()为str,并将它们存储在临时双变量。

当我打印该双变量的值时,它输出的数字比点之后应该多。

预期输出应该是:

xxx.xxxxxx 

,但我使用setprecision(20)获得

xxx.xxxxxxxxxxxxxxxx 

。任何想法为什么会发生这种情况?另外我怎样才能读取文件中的内容?

+3

考虑使用更具描述性的标题。 =) – 2012-08-15 07:46:59

+0

请提供一个最小工作示例(包括您的输入文件)以允许其他人重现观察到的行为。否则,在这里提出这样的问题是毫无意义的。 – moooeeeep 2012-08-15 07:51:11

+0

您的“预期产出”低于您的精确度!如果你使用'setprecision(20)',获得20位数不应该是令人惊讶的!这不是你要求的吗?如果它在那里,例如PI的自然形式永远不会终止或重复,它就会显示出其极限。因此,在一个PI示例中,您可以使用任何'setprecsion',您喜欢它将是3.(xNumberOfPrecisionPointsLeft)。 – ChiefTwoPencils 2012-08-15 08:02:01

回答

1

您正在阅读文件内容,但不能储存确切数字。不是每个数字都可以精确地表示为double(或其他任何事情)。因此,你会得到一个近似值。

4

如果你要求输出20位数的精度,你会得到它。 你似乎很惊讶,你得到了你明确要求的东西 。除20位数字以外的任何其他值都会让我感到惊讶。

至于你读什么,通常,一个有6位小数的数字没有 在double中的确切表示; strtod()将返回最接近的 近似值。

我建议不要试图使用double,直到您阅读并且 理解为 http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.htmldouble不是一个实数。

+0

为什么把你的答案作为评论放在第一位? – 2012-08-15 08:12:41

+0

@RobertoWilko作为序言,是的:-)。我认为重要的一点是,具有六位小数的数字不具有确切的表示形式,如果您要使用'double',您最好先了解它是什么(这是文档I链接来解释)。 – 2012-08-15 08:54:47

+0

你的包包伙伴中有我的+1! – ChiefTwoPencils 2012-08-15 08:59:16

相关问题