2015-08-26 254 views
1

我的工作应该输出22258199.5000000这个号码,我已存储的结果在双数据类型的一些C++的问题,当我试图在使用变量的std ::法院就四舍五入到22258200.0000000,我不知道为什么就是打印这发生?有人可以解释吗?我能做些什么来避免这个问题?如何避免大浮点或双精度值的舍入?

+2

请**用[mcve]或[SSCCE(Short,Self Contained,Correct Example)](http://sscce.org)您的问题 – NathanOliver

+4

您几乎可以肯定地使用'float '类型,转换或某处的常量 - 这是最接近原始值的单精度值。 –

+2

将cout的精度设置为15个有效数字:对于浮点双精度数的一个很好的经验法则。如果你使用'浮动',那么你的运气不好。 – Bathsheba

回答

3

一个32位float型保持大约7位十进制数字,和任何超出将被舍入到最接近的可表示值。

64位double类型保存大约15个十进制数字,并且还四舍五入超出值。

由于您的值四舍五入到最接近的7位号码,看来您使用的是float变量的地方。将float值复制到double不会恢复丢失的数字。

这并不适用于你的榜样,但它可能在其他 - 发生的舍入二进制,不是小数,所以你可能最终似乎包含更多的数字比我上面所指出的值。只要知道只有前7或15将准确的十进制。

+0

我发现问题,这是造成这个问题的cout流,我只使用double,但它使用cout打印时四舍五入。我使用cout.precision(15)来设置精度,它工作正常。 –