2015-08-26 270 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)來設置精度,它工作正常。 –