我有一个包含在每个像线的一些值的文本文件:为什么setPrecision不会自动使用最小可用精度?
xxx.xxxxxx
我读每一行和将它们转换使用strod()为str,并将它们存储在临时双变量。
当我打印该双变量的值时,它输出的数字比点之后应该多。
预期输出应该是:
xxx.xxxxxx
,但我使用setprecision(20)获得
xxx.xxxxxxxxxxxxxxxx
。任何想法为什么会发生这种情况?另外我怎样才能读取文件中的内容?
我有一个包含在每个像线的一些值的文本文件:为什么setPrecision不会自动使用最小可用精度?
xxx.xxxxxx
我读每一行和将它们转换使用strod()为str,并将它们存储在临时双变量。
当我打印该双变量的值时,它输出的数字比点之后应该多。
预期输出应该是:
xxx.xxxxxx
,但我使用setprecision(20)获得
xxx.xxxxxxxxxxxxxxxx
。任何想法为什么会发生这种情况?另外我怎样才能读取文件中的内容?
您正在阅读文件内容,但不能储存确切数字。不是每个数字都可以精确地表示为double
(或其他任何事情)。因此,你会得到一个近似值。
如果你要求输出20位数的精度,你会得到它。 你似乎很惊讶,你得到了你明确要求的东西 。除20位数字以外的任何其他值都会让我感到惊讶。
至于你读什么,通常,一个有6位小数的数字没有 在double中的确切表示; strtod()
将返回最接近的 近似值。
我建议不要试图使用double
,直到您阅读并且 理解为 http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html。 double
是不是一个实数。
为什么把你的答案作为评论放在第一位? – 2012-08-15 08:12:41
@RobertoWilko作为序言,是的:-)。我认为重要的一点是,具有六位小数的数字不具有确切的表示形式,如果您要使用'double',您最好先了解它是什么(这是文档I链接来解释)。 – 2012-08-15 08:54:47
你的包包伙伴中有我的+1! – ChiefTwoPencils 2012-08-15 08:59:16
考虑使用更具描述性的标题。 =) – 2012-08-15 07:46:59
请提供一个最小工作示例(包括您的输入文件)以允许其他人重现观察到的行为。否则,在这里提出这样的问题是毫无意义的。 – moooeeeep 2012-08-15 07:51:11
您的“预期产出”低于您的精确度!如果你使用'setprecision(20)',获得20位数不应该是令人惊讶的!这不是你要求的吗?如果它在那里,例如PI的自然形式永远不会终止或重复,它就会显示出其极限。因此,在一个PI示例中,您可以使用任何'setprecsion',您喜欢它将是3.(xNumberOfPrecisionPointsLeft)。 – ChiefTwoPencils 2012-08-15 08:02:01