本文目錄一覽:
c語言中有沒有進行四捨五入的函數?
四捨五入演算法:如果要求精確到小數點後面的第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倍,並轉換成浮點型*/
C語言編程 、對輸入的任意一個數按照四捨五入法取整?
#includestdio.h
int round1(float a)
{
return (int)(a+0.5);
}
int main()
{
float x;
printf(“請輸入一個浮點數:”);
scanf(“%f”,x);
printf(“四捨五入的結果是:%d”,round1(x)) ;
return 0;
}
延展閱讀:
C語言是一門通用計算機編程語言,應用廣泛。C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。
儘管C語言提供了許多低級處理的功能,但仍然保持著良好跨平台的特性,以一個標準規格寫出的C語言程序可在許多電腦平台上進行編譯,甚至包含一些嵌入式處理器(單片機或稱MCU)以及超級電腦等作業平台。
c語言四捨五入怎麼表示
要用C語言實現四捨五入,有一個很巧妙的方法,僅使用int i=(int)(a+0.5)即可。如果遇到有負數的情況,只需要將加號改為減號即可。
C語言中四捨五入這樣表示:
inta=100.453627。
printf(“%.1f”,a+0.05);//四捨五入到十分位。
printf(“%.2f”,a+0.005);//四捨五入到百分位。
以此類推,對於十進位小數.5類型數(如0.5,11.5,18.5),即小數部分可以以2的負一次方來表示的數,這時計算機是可以「完美」的儲存這個十進位小數字。而對於.6,.7,.8,.9與.4,.3,.1,.2,這類數字,計算機雖然無法「完美」的儲存這些數字,在這樣的情況下可以運用所謂的「+0.5的取整法」。
所謂加0.5的取整法就是運用在C語言中浮點型數強制轉化為整形數時只會其保留整數,而不會進行四捨五入的計數法則。所以對於保留整數的小數來說,我們只需在其原來的基礎上+0.5後再進行強制類型轉換,就可以達到不會出錯的四捨五入。
有的標準不存在C語言四捨五入:
C語言中的四捨五入在C98標準中,標準C函數庫是沒有關於四捨五入的函數的,到了C99標準才出現了ceil(),floor(),nearbyint(),round()之類豐富的取整函數。
現在使用的gcc都是C99標準了,而Windows下的VC(包括VS2008)還是C98標準,所以需要遵從嚴格格式,包括沒有內聯inline、沒有單行注釋//、變數要寫在代碼塊的前頭等等,最大的缺點就是沒有那些函數的支持。
c語言中有沒有進行四捨五入的函數
首先,這個問題的解決方案取決於我們所需要的轉換方式:是截斷轉換還是舍入轉換;另一方面,它基本與我們需要轉換的浮點數類型無關──無論是 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) {
assert(x = LONG_MIN-0.5);
assert(x = LONG_MAX+0.5);
if (x = 0)
return (long) (x+0.5);
return (long) (x-0.5);
}
如果在意效率的話,可以寫這樣一個宏
#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 limits.h,並且有一個處理錯誤的函數 error,其返回值為 long 類型。
原創文章,作者:SPAE,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/133868.html