float浮點數的四捨五入

2021-09-08 12:52:30 字數 3138 閱讀 3804

前幾天,有個小夥伴在做實驗過程中,發現了乙個奇怪的現象,這個現象就是…

他在用printf輸出浮點數的時候,想把資料保留到小數點後的兩位,他是這麼寫的…

float c=1.155;printf(「%.2f」,c);

他的書寫是對的,沒有錯誤。但是他發現,當c等於1.555時,保留兩位小數輸出是1.55,而當c等於3.555時,保留兩位小數輸出是3.56。這個結果,就讓人捉摸不透了,因為…

如果是程式運算會自動四捨五入的話,結果應該是1.56和3.56;如果程式運算不會自動四捨五入的話,結果應該是1.55和3.55。可是結果卻是1.55和3.56,這是什麼鬼?

而有些人會說,不會自動四捨五入,如下圖…

到底會不會自動四捨五入呢?

我剛才拿老頑童stm32開發板做了乙個實驗,我定義了6個浮點數,他們分別是…

然後我用printf給他們保留2位小數後輸出,程式如下…

在串列埠除錯助手上看到的結果是…

結果是,6個數,有3個數自動四捨五入了,有3個數沒有四捨五入。

不管理論是什麼,我們只看結果。結果是:浮點數保留小數點後的資料,有時會自動四捨五入,有時不會自動四捨五入。但是…

如果把乙個浮點數賦給乙個整數變數後,一定不會四捨五入。

所以,我們在保留浮點數的小數點精度時,必須要人工處理四捨五入

很多人一直在用的乙個的方法,就是加0.5法

這個方法的理論依據是:

float f;//定義了乙個浮點數

int t;//定義了乙個整數

我們執行(t=f;)這條語句,不管f的小數點後面是小於5的數,還是大於等於5的數,都不會四捨五入,例如當f=3.2和f=3.8,結果都是t=3。

那麼怎麼樣讓f=3.8時,t=4呢?我們可以給f+0.5來解決,例如當f=3.8時,f+0.5=4.3,執行完t=f後,t就等於4了。而當f的小數點後的的數都小於5時,加乙個0.5不會大於4,所以執行完t=f後,結果還都是3。這正好符合我們四捨五入的要求。

這裡需要注意的是:其實這個…

加0.5的方法

只適合用於保留整數字的應用

很多人都不知道這一點,下面我就給大家實踐一下。

按照加0.5法的原理,如果要保留2位有效資料的話,需要給資料加0.005,我們做個實驗,把temp1~6都加0.005。

然後我們看輸出結果,如下圖…

看到了正確的結果,你不要高興,因為…

你現在可以把temp1~6的小數點後面都改為554,如下圖…

這時候,正確的結果,小數點後兩位應該都是55,但是你看看結果,還是照樣是56。這時候,就輸出了完全錯誤的結果。

有的朋友會說,既然加0.005不行,那我們想辦法還是加0.5吧。好的,下面我有乙個方法…

先把temp1*100,然後再+0.5,然後把這個浮點數賦值給乙個整數,然後再把這個整數除以100。

例如temp5的程式寫為…

temp5=temp5*100+0.5;

t5=temp5;

temp5=(float)t5/100;

其中,t5是我定義的乙個uint32_t型別的整型變數。我們來分析一下,因為temp5=4.555,4.555乘以100以後是455.50,然後再加0.5以後是456.00,把456.00取整後是456,然後456除以100就是4.56。

一切都算計的很好,但是實際的結果卻還是4.55。但是如果你這樣寫的話,結果就是正確的…

temp5=4.555*100+0.5;

t5=temp5;

temp5=(float)t5/100;

看這個程式和上邊的程式對比一下,只是這裡直接用了4.555,而上邊的程式用了temp5,看似一樣,結果卻不一樣。上邊程式的結果是4.55,下邊程式的結果是4.56。

上邊兩個加0.5的實踐,你一定要試一下。

那保留2位小數,怎麼做才能確保完全正確?

我們可以把小數點後的第三位數取出來,然後判斷它和5的大小,然後四捨五入。就是這個方法,絕對正確。寫成程式的話,是這個樣子的…

其中,t1是定義的uint32_t型別的整型變數。我們把資料帶進去看一下,temp1是0.555,0.555乘以1000是555,555除以100取餘數是55,55再除以10取餘數是5,那t1就等於5。下面用if語句判斷是否要進製,如果需要進製的話,4.555乘以100就是455.5,455.5加1就是456.5,然後我們把456.5強制型別轉換成整型資料,就是456,456除以100,就是4.56;如果不需要進製的情況,大家自行分析。

這時候,你去換temp1~6的值去吧,不管換什麼,結果都會四捨五入。

做乙個穩定的電子產品,基礎知識很重要!

php浮點數四捨五入函式

在php中浮點數四捨五入的兩個常用的函式round與此同時ceil函式,可能小數保留位數.round 函式對浮點數進行四捨五入 語法 float round float val int precision 返回將 val 根據指定精度 precision 十進位制小數點後數字的數目 進行四捨五入的結...

bcb中浮點數的四捨五入的問題

有關浮點數的位數的常用函式 四捨五入函式 formatfloat 0.00 小數 四捨五入,保留兩位小數 按位截斷函式 format 2f arrayofconst 小數 截斷兩位小數,不會四捨五入 今天我又使用了formatfloat 函式來進行四捨五入,發現這個函式對有些浮點數可以四捨五入,有些...

python浮點數四捨五入的問題的分析

python中round做四捨五入要說清楚並不容易。有一種奇進偶舍的說法並不準確。下面的例子就無法用奇進偶舍來解釋 print round 1.275,2 1.27 原因分析 float採用二進位制編碼描述浮點數。在二進位制表示中,大多數有限位十進位制小數無法使用有限位二進位制進行精確表示。也就是說...