關於C C 的四捨五入方向

2022-08-31 10:27:09 字數 1550 閱讀 8074

今天在刷題過程中發現了乙個特別奇怪的現象,printf() 的精度控制不是按照4舍5入,而是按照5舍6入,

例如:

printf("

%.2f\n

",0.145

)printf(

"%.2f\n

",0.146)

結果分別為

0.14

0.15

隨後的實驗中,有乙個更加奇怪的現象

printf("

%.2f\n

",0.155)

的結果為

0.16

這就很是奇怪了,一會四捨五入,一會五舍六入的。。。。。

原來這是因為ieee 754標準中對浮點數捨入方向的規定,參見這篇部落格

下面摘抄關於捨入規定的片段:

四種捨入方向:

向最接近的可表示的值;當有兩個最接近的可表示的值時首選「偶數」值;向負無窮大(向下);向正無窮大(向上)以及向0(截斷)。

說明:捨入模式也是比較容易引起誤解的地方之一。我們最熟悉的是四捨五入模式,但是,ieee 754標準根本不支援,它的預設模式是最近捨入(round to nearest),它與四捨五入只有一點不同,對.5的捨入上,採用取偶數的方式。舉例比較如下:

例2:

最近捨入模式:round(0.5) =0; round(1.5) = 2; round(2.5) =2;

四捨五入模式:round(0.5) =1; round(1.5) = 2; round(2.5) =3;

主要理由:由於字長有限,浮點數能夠精確表示的數是有限的,因而也是離散的。在兩個可以精確表示的相鄰浮點數之間,必定存在無窮多實數是ieee浮點數所無法精確表示的。如何用浮點數表示這些數,ieee 754的方法是用距離該實數最近的浮點數來近似表示。但是,對於.5,它到0和1的距離是一樣近,偏向誰都不合適,四捨五入模式取1,雖然銀行在計算利息時,願意多給0.5分錢,但是,它並不合理。例如:如果在求和計算中使用四捨五入,一直算下去,誤差有可能越來越大。機會均等才公平,也就是向上和向下各佔一半才合理,在大量計算中,從統計角度來看,高一位分別是偶數和奇數的概率正好是50% : 50%。至於為什麼取偶數而不是奇數,大師knuth有乙個例子說明偶數更好,於是一錘定音。最近捨入模式在c/c++中沒有相應的函式,當然,ieee754以及x86 fpu的預設捨入模式是最近捨入,也就是每次浮點計算結果都採用最近捨入模式,除非用程式顯式設定為其它三種捨入模式。

另外三種捨入模式,簡要說明。

向0(截斷)捨入:c/c++的型別轉換。(int) 1.324 = 1,(int) -1.324 = -1;

向負無窮大(向下)捨入:c/c++函式floor()。例如:floor(1.324) = 1,floor(-1.324) = -2。

向正無窮大(向上)捨入:c/c++函式ceil()。ceil(1.324) = 2。ceil(-1.324) = -1;

後兩種捨入方法據說是為了數值計算中的區間演算法,但很少聽說哪個商業軟體使用區間演算法。

關於四捨五入

四捨五入 轉http nssoft.showdoc.asp?did 267 delphi的四捨五入函式round,對於 5的情況,整數部分是奇數,那麼會round up,偶數會round down,例如 x round 17.5 x 18 x round 12.5 x 12 請使用下面的函式代替ro...

qt的四捨五入 Qt(C )四捨五入

qt現在是四捨六入五成雙,要想四捨五入得自己想辦法,實現如下 include include double c1 3.435 double c2 3.445 double c3 3.4351 double c4 3.4451 double c5 3.445 qdebug qdebug qdebug ...

mysql 金額 四捨五入 mysql四捨五入

雲資料庫 mysql 雲資料庫 rds for mysql 是穩定可靠 可彈性伸縮的雲資料庫服務。通過雲資料庫能夠讓您幾分鐘內完成資料庫部署。雲端完全託管,讓您專注於應用程式開發,無需為資料庫運維煩惱 低至 0.24 小時起,買1年83折 雲資料庫mysql 雲資料庫 rds for mysql 是...