簡體   English   中英

在c中遇到麻煩

[英]Having trouble rounding in c

在試圖找出如何將1.255的浮點數舍入到最接近的百分之一時,我發現了一些有趣的東西。 我在Debian 6上使用gcc 4.4.5。

int   x = (1.255 * 100) + 0.5;   //  gives me back 125 instead of 126. 
float y = (1.255 * 100) + 0.5;   //  gives me back 126.000000. 

為什么當我保存到int我得到125而不是126 在fedora中,當我將上面的表達式保存到int我得到了126 這是debian中的gcc bug嗎? 任何幫助將不勝感激。 謝謝。

雖然這看起來像一個“典型的”浮點問題,但它比這更復雜。

這個涉及三件事的組合:

讓我們打破這個:

浮點文字默認為double類型。 因此1.255double類型。

因此表達式:

(1.255 * 100) + 0.5

是使用double類型完成的。

但由於二進制浮點不能完全表示1.255 ,因此表達式的計算結果為:

(1.255 * 100) + 0.5 = 125.99999999999999000000

並且是double類型。

由於這小於126 ,將其存儲為整數將導致125 將它存儲到float會將其四舍五入到最近的float ,結果為126


int    x = (1.255 * 100.) + 0.5;
float  y = (1.255 * 100.) + 0.5;
double z = (1.255 * 100.) + 0.5;

cout << fixed;
cout << x << endl;
cout << setprecision(20) << y << endl;
cout << setprecision(20) << z << endl;

輸出:

125
126.00000000000000000000
125.99999999999999000000

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM