[英]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.255
是double
類型。
因此表達式:
(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.