2014-10-04 115 views
6

如果我使用C++代碼:C++雙待很長很長

long long d = 999999998.9999999994; 
cout<<d; 

我得到的輸出:999999999(四捨五入)

但是這段代碼的輸出:

long long d = 999999998.9999994994; 
cout<<d; 

999999998 (四捨五入)

它是否與精度有關。有什麼辦法可以改變精確度嗎? floor()函數也給出相同的輸出。

我也注意到,如果我指定值8.99999949948.9999999994d(上面的變量)。輸出是8

+0

您可以明確添加0.5,並將long double強制轉換爲double。 – 2014-10-04 19:42:42

+0

C++ 11支持?用戶定義的文字可以提供幫助。 – Yakk 2014-10-04 20:52:15

+0

@OleksandrVerhun你可以做到這一點,但如果你的目標是將浮點數四捨五入到最接近的整數,你不應該這樣做。 http://blog.frama-c.com/index.php?post/2013/05/02/nearbyintf1 – 2014-10-04 21:03:11

回答

10

999999998.9999999994不在double精確表示,因此實際值是上的999999998.9999999994任一側上的兩個可表示數字中的一個 - 無論是999999998.99999988079071044921875999999999(假設IEEE-754 binary64格式),在一個實現定義的方式選擇。大多數系統默認會舍入到最近,產生999999999

最終的結果是,在你寫這些系統時999999998.9999999994它最終會產生與編寫999999999.0完全相同的效果。因此,後續轉換產生999999999 - 從浮點數到整數的轉換總是被截斷,但這裏沒有任何要截斷的內容。

對於999999998.9999994994,最接近的可表示數字是999999998.999999523162841796875999999998.99999940395355224609375。截斷後任一個產生999999998。類似地,對於8.9999999994,最接近的可表示數字是8.9999999993999999503557774005457758903503417968758.9999999994000017267126168007962405681610107421875,並且在截斷後任一人將產生8

4
long long d = 999999998.9999999994; 

最接近值999999998.9999999994double可以表示是999999999.0 - 記住,浮點具有有限精度)。
因此,截斷小數位產生999999999,那就是d中保存的內容。

使用文字L -suffix確實導致999999998保存在d-long double具有更高的精度。

long long d = 999999998.9999994994; 

最接近值999999998.9999994994double可以代表實際上是低於999999999 - 我的機器上大約999999998.999999523。隨後截斷小數位數產生999999998,並存儲在d中。