c語言中有沒有進行四捨五入的函式

2021-04-18 12:28:06 字數 4913 閱讀 3301

1樓:韌勁

首先,這個問題的解決方案取決於我們所需要的轉換方式:是截斷轉換還是捨入轉換;另一方面,它基本與我們需要轉換的浮點數型別無關──無論是 float 還是 double,甚至是 long double。

有時人們覺得乙個浮點變數的值和乙個整型變數的值可以完全一樣地可表示,你可能相信 x 值為 100.0 時我們只要把它轉換為整型就會得到整數 100。但在任何時候,你都不應依賴於期望乙個浮點數的值能夠與乙個整型數的值完全相等,你真正所需要的可能是四捨五入。

截斷轉換的意思是拋棄所有的小數部分,例如 3.9 將被轉換為 3,這種轉換是 c 語言中將浮點數轉換為整型數的預設方式,也就是說無論在什麼時候,只要將浮點數轉換為整型數,採用的都是這種方式。關於這種轉換何時發生,有一些特殊的規定,這裡我們僅指出賦值時所發生的轉換,比如

i = x;

其中 i 是乙個整型數,x 是乙個浮點數。當然,在顯式型別轉換的情況下,這樣的轉換也會發生,比如

(int) x

捨入轉換是指獲取與給定浮點數最為接近的整型數,因此 3.9 應被轉換為 4,這才是人們提出我們正在解決的這個問題時所真正需要的。對於捨入轉換,我們沒有直接的工具(比如運算子或者庫函式),嚴格地說,捨入轉換並非與 c 標準裡所定義的轉換在同一意義下的轉換。

對於正的浮點數,最簡單的四捨五入方法就是用這樣的乙個表示式

(long) (x+0.5)

但是如果表示式對負數有效的話會更好,即使在你看來負數的情況不會發生。這意味著你可以用乙個條件表示式:

x >= 0 ? (long)(x+0.5) : (long)(x-0.5)

這個表示式的返回值就是與浮點變數 x 的值最接近的整數值。

如果需要大量地使用捨入轉換,則可以寫這樣的乙個巨集:

#define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5))

這可以在某種程度上使**更具可讀性。

注意到這樣的轉換會將 1.5 變為 2 但卻將 -1.5 變為 -2,那麼對於這樣正好處於兩個整數之間的浮點數,你可能需要做一些其它的處理,但這在實際當中並不十分重要。

需要小心的是,將乙個浮點數轉換為乙個整型數可能導致上溢,但大多數的實現都沒有進行相關的判斷。用 long 替代 int 會給出乙個更寬的範圍(建議使用 long),但仍然比浮點數的範圍要小得多。

如果效率不是至關重要的話,則可以定義這樣的乙個函式(而不是簡單地寫乙個 #define),使你的程式更具魯棒性:

long round(double x)

如果在意效率的話,可以寫這樣乙個巨集

#define round(x) ((x) < long_min-0.5 || (x) > long_max+0.5 ?\

error() : ((x)>=0?(long)((x)+0.5):(long)((x)-0.5))

這要求在程式中有 #include ,並且有乙個處理錯誤的函式 error,其返回值為 long 型別。

2樓:朱巨集建

四捨五入演算法:如果要求精確到小數點後面的第n位,則需要對第n+1位進行運算。方法是將該小數乘以10的n+1次方後加5,然後除以10並強制轉換變數型別為長整型,再將該數除以10的n次方,同時強制轉換型別為浮點型。

**實現如下:

long t; /*定義長整型變數t*/t=(h*10n+1+5)/10; /*對h進行操作,得到值浮點型,t取值時取整數部分。10n+1為要擴大的倍數*/

h=(float)t/10n;  /*將t縮小10n倍,並轉換成浮點型*/

3樓:

標c沒有相應函式,但可以間接實現

a=(int)(2.5);//a=floor(2.5)

a=(int)(2.5+0.5);//a=ceil(2.5) 加0.5相當於四捨五入

4樓:匿名使用者

沒見過,不過你可以自己用小技巧:比如要保留2位小數的float a 第三位四捨五入

則可以這樣 a = (int)(a*100 + 0.5)/100

5樓:匿名使用者

round(x)

引數時double型,返回小數對整數部分的四捨五入值

比如 round(3.623); 返回4

c語言中怎麼四捨五入

6樓:匿名使用者

利用取整運算的截斷特點實現。

比如:int a=0.75;取整後賦值給a的是0,小數點後面的被截斷了。

如果要做整數的四捨五入,那麼可以:a=(int)(0.75+0.5);取整後得到的與數學中四捨五入的結果一致,都是1;

如果要進行小數點後面的四捨五入,可以這樣計算:

要保留小數點後面兩位的小數,即在小數點後面兩位上做四捨五入,0.756

float a=0.756,b; int x; b=a*100; b+=0.5; x=b; b=x/100.0;

運算是這樣的:先將0.756乘以100,得到75.

6,然後利用取值運算的截斷做四捨五入,75.6+0.5=76.

1取整後等於76,再除以100,得到結果:0.76

7樓:高中生三

設 float x ; int  y ; 則有y=(int)(x+0.5)>(int)x?(int)x+1:(int)x進行上述運算後,y 的值就是 x 四捨五入的結果。

利用取整運算的截斷特點實現。

比如:int a=0.75;取整後賦值給a的是0,小數點後面的被截斷了。

如果要做整數的四捨五入,那麼可以:a=(int)(0.75+0.5);取整後得到的與數學中四捨五入的結果一致,都是1;

如果要進行小數點後面的四捨五入,可以這樣計算:

要保留小數點後面兩位的小數,即在小數點後面兩位上做四捨五入,0.756

float a=0.756,b; int x; b=a*100; b+=0.5; x=b; b=x/100;

運算是這樣的:先將0.756乘以100,得到75.

6,然後利用取值運算的截斷做四捨五入,75.6+0.5=76.

1取整後等於76,再除以100,得到結果:0.76

8樓:請叫我小強

如果是保留後面的兩位小數,就應該用取整,

比如0.756

double a=0.756;

a=(a*100+0.5)/100.0;

printf(「%.2lf",a)

9樓:聽不清啊

如果只是要求輸出結果「四捨五入」,只要通過輸出格式符控制即可。

例如:double pi=3.1415926;

printf("%.4lf\n",pi);

可得輸出為3.1416。

printf("%.2lf\n",pi);

可得輸出為3.14。

如果是要把變數本身的值四捨五入到4位小數,則可以這樣處理:

double pi=3.1415926;

pi=((int)(pi*10000+0.5))/10000.0;

10樓:匿名使用者

有乙個round函式可以

直接呼叫,

#include"stdio.h"

#include"math.h"

void main()

11樓:匿名使用者

將整數+5,再整除10,再乘以10,就可以了參考**:

#include

int main()

12樓:匿名使用者

round(x)

引數時double型,返回小數對整數部分的四捨五入值

比如 round(3.623); 返回4

13樓:量子高巨集亮

y = (int)(x+0.5);

14樓:匿名使用者

int main()

15樓:匿名使用者

比如小數為 f

(float)((int)(f*100+0.5))/100.0

首先為了保留兩位,乘以100,小數點向前兩位, 然後+0.5取整保證是四捨五入 再轉成 float形式或double形式 除以100 就ok了

16樓:毛毛

利用取整運算的截斷特點實現。

17樓:匿名使用者

給你個簡單的餓例子

四捨五入小數點後一位

float f=1.54536;

f=(int)(f*10+5)/10.0;

你分析看看就知道了

#include

main()

18樓:匿名使用者

中間函式這樣填:

float x;

int a;

cin>>x;

if(x>=0)

a=x+0.5;

else

a=x-0.5;

19樓:清雅之蘭向日葵

使用乙個if語句,讓它的值減去它的整數形式然後與0.5比較

20樓:菜鳥公升級中

int a = 100.453627

printf("%.1f",a + 0.05); //四捨五入到十分位

printf("%.2f",a + 0.005); //四捨五入到百分位

後面的方法一樣

21樓:匿名使用者

那你這個是什麼意思呢。。不許用「%.1f %.2f。。。

我的想法是,十分位,你就把你的數*10,然後%10的到的餘數就是這位。。。百分位類似。。

後續怎麼輸出,你就自己看著辦吧。。反正小數點你是肯定要自己輸出了 :)

22樓:我在天堂d你

最後一步錯啦,要b=(float)x/100

c語言中有關區域性常量的定義,C語言中是如何定義常量的啊

第乙個錯誤是 預編譯定義 defineca應該放在函式的外面,而且是程式檔案的開頭,而你把它放在函式內部了 第二個錯誤是 定義陣列 ints c 時,陣列長度必需用常量,在這裡,c雖然貌似是個常量,但先不說c本身的定義是錯的,而它所代表的卻是a,而a是變數,所以是錯誤。改正之後的結果應該是 incl...

c語言中有string型別變數嗎

這裡的 string 有 二 義性。1 如果 string 是普通詞彙,c語言中有字元型別變數嗎 答,有。字元型別 用 char 宣告。char str this is a string 2 如果 string 是專用詞彙,c語言中有string型別變數嗎 答,沒有。string 是 類,是 cla...

C語言運算子都有那些,c語言中有哪些運算子,各有什麼功能?

運算子的種類c語言的運算子可分為以下幾類 1.算術運算子 用於各類數內值運算。包括加 減 乘容 除 求餘 或稱模運算,自增 自減 共七種。2.關係運算子 用於比較運算。包括大於 小於 等於 大於等於 小於等於 和不等於 六種。3.邏輯運算子 用於邏輯運算。包括與 或 非 三種。4.位操作運算子 參與...