① 在c語言中,如何將一個浮點數變換成整數
需要准備的材料分別有:電腦、C語言編譯器。
1、首先,打開C語言編譯器,新建一個初始.cpp文件,例如:test.cpp。
② c語言中如何輸入一個浮點數x然後輸出x但保留五位小數
聲明變數x為double型(浮點雙精度)或float(浮點單精度)。
調用輸入函數scanf("%lf",&x);或scanf("%f",&x);——其中%lf表示x是double型、%f表示float型。
調用printf("%.5f ",x);輸出——其中.5表示小數點後保留5位小數。
③ C語言的浮點型怎麼轉換為整型
C語言中,浮點型轉換為整型可以用:強制類型轉換、自動類型轉換,例如:(int)3.14、int a = 3.14。
1、強制類型轉換
強制類型轉換是通過類型轉換運算來實現的。其一般形式為:(類型說明符)(表達式),其功能是把表達式的運算結果強制轉換成類型說明符所表示的類型。
例如: (double) a 把a轉換為雙精度浮點型,(int)(x+y) 把x+y的結果轉換為整型。
2、自動類型轉換
(1)執行算術運算時,低類型(短位元組)可以轉換為高類型(長位元組);例如: int型轉換成double型,char型轉換成int型等。
(2)賦值表達式中,等號右邊表達式的值的類型自動隱式地轉換為左邊變數的類型,並賦值給它。
(3)函數調用時,將實參的值傳遞給形參,系統首先會自動隱式地把實參的值的類型轉換為形參的類型,然後再賦值給形參。
(4)函數有返回值時,系統首先會自動隱式地將返回表達式的值的類型轉換為函數的返回類型,然後再賦值給調用函數返回。
(3)c語言一個浮點數怎麼只輸出整數擴展閱讀:
C語言中常用的數據類型:
1、int:整型
2、float:單精度浮點型
3、double:雙精度浮點型
4、char:字元型
5、char *:字元指針型
④ C語言程序設計:輸入浮點數12.5分別輸出它的整數數部分和小數部分!
這個進行轉換就能完成
#include<stdio.h>
intmain()
{
floata,c;
intb;
printf("請輸入一個小數:");
scanf("%f",&a);
b=(int)(int)(a+1.0e-6);;
c=a-b;
printf("
輸入的是:%f整數是:%d小數是:%f
",a,b,c);
}
⑤ 請教C語言浮點數輸出問題。
調試了一下發現這個,8.85705,和9.85705的精度都會丟失,所以要想得到你要的數據建議使用%.5f
為何浮點數可能丟失精度浮點十進制值通常沒有完全相同的二進製表示形式。 這是 CPU 所採用的浮點數據表示形式的副作用。 為此,可能會經歷一些精度丟失,並且一些浮點運算可能會產生意外的結果。
導致此行為的原因是下面之一:
十進制數的二進製表示形式可能不精確。
使用的數字之間類型不匹配(例如,混合使用浮點型和雙精度型)。
為解決此行為,大多數程序員或是確保值比需要的大或者小,或是獲取並使用可以維護精度的二進制編碼的十進制 (BCD) 庫。
現在我們就詳細剖析一下浮點型運算為什麼會造成精度丟失?
1、小數的二進製表示問題
首先我們要搞清楚下面兩個問題:
(1) 十進制整數如何轉化為二進制數
演算法很簡單。舉個例子,11表示成二進制數:
11/2=5 余 1
5/2=2 余 1
2/2=1 余 0
1/2=0 余 1
0結束 11二進製表示為(從下往上):1011
這里提一點:只要遇到除以後的結果為0了就結束了,大家想一想,所有的整數除以2是不是一定能夠最終得到0。換句話說,所有的整數轉變為二進制數的演算法會不會無限循環下去呢?絕對不會,整數永遠可以用二進制精確表示,但小數就不一定了。
(2) 十進制小數如何轉化為二進制數
演算法是乘以2直到沒有了小數為止。舉個例子,0.9表示成二進制數
0.9*2=1.8 取整數部分 1
0.8(1.8的小數部分)*2=1.6 取整數部分 1
0.6*2=1.2 取整數部分 1
0.2*2=0.4 取整數部分 0
0.4*2=0.8 取整數部分 0
0.8*2=1.6 取整數部分 1
0.6*2=1.2 取整數部分 0
......... 0.9二進製表示為(從上往下): 1100100100100......
注意:上面的計算過程循環了,也就是說*2永遠不可能消滅小數部分,這樣演算法將無限下去。很顯然,小數的二進製表示有時是不可能精確的。其實道理很簡單,十進制系統中能不能准確表示出1/3呢?同樣二進制系統也無法准確表示1/10。這也就解釋了為什麼浮點型減法出現了"減不盡"的精度丟失問題。
2、float型在內存中的存儲
眾所周知、Java 的float型在內存中佔4個位元組。float的32個二進制位結構如下
float內存存儲結構
4bytes 31 30 29----23 22----0
表示 實數符號位 指數符號位 指數位 有效數位
其中符號位1表示正,0表示負。有效位數位24位,其中一位是實數符號位。
將一個float型轉化為內存存儲格式的步驟為:
(1)先將這個實數的絕對值化為二進制格式,注意實數的整數部分和小數部分的二進制方法在上面已經探討過了。
(2)將這個二進制格式實數的小數點左移或右移n位,直到小數點移動到第一個有效數字的右邊。
(3)從小數點右邊第一位開始數出二十三位數字放入第22到第0位。
(4)如果實數是正的,則在第31位放入「0」,否則放入「1」。
(5)如果n 是左移得到的,說明指數是正的,第30位放入「1」。如果n是右移得到的或n=0,則第30位放入「0」。
(6)如果n是左移得到的,則將n減去1後化為二進制,並在左邊加「0」補足七位,放入第29到第23位。如果n是右移得到的或n=0,則將n化為二進制後在左邊加「0」補足七位,再各位求反,再放入第29到第23位。
舉例說明: 11.9的內存存儲格式
(1) 將11.9化為二進制後大約是"1011.1110011001100110011001100..."。
(2) 將小數點左移三位到第一個有效位右側:"1.01111100110011001100110"。保證有效位數24位,右側多餘的截取(誤差在這里產生了)。
(3)這已經有了二十四位有效數字,將最左邊一位「1」去掉,得到「01111100110011001100110」共23bit。將它放入float存儲結構的第22到第0位。
(4) 因為11.9是正數,因此在第31位實數符號位放入「0」。
(5) 由於我們把小數點左移,因此在第30位指數符號位放入「1」。
(6) 因為我們是把小數點左移3位,因此將3減去1得2,化為二進制,並補足7位得到0000010,放入第29到第23位。
最後表示11.9為:
再舉一個例子:0.2356的內存存儲格式
(1)將0.2356化為二進制後大約是0.00111100010100000100100000。
(2)將小數點右移三位得到1.11100010100000100100000。
(3)從小數點右邊數出二十三位有效數字,即11100010100000100100000放
入第22到第0位。
(4)由於0.2356是正的,所以在第31位放入「0」。
(5)由於我們把小數點右移了,所以在第30位放入「0」。
(6)因為小數點被右移了3位,所以將3化為二進制,在左邊補「0」補足七
位,得到0000011,各位取反,得到1111100,放入第29到第23位。
最後表示0.2356為:
將一個內存存儲的float二進制格式轉化為十進制的步驟:
(1)將第22位到第0位的二進制數寫出來,在最左邊補一位「1」,得到二十四位有效數字。將小數點點在最左邊那個「1」的右邊。
(2)取出第29到第23位所表示的值n。當30位是「0」時將n各位求反。當30位是「1」時將n增1。
(3)將小數點左移n位(當30位是「0」時)或右移n位(當30位是「1」時),得到一個二進製表示的實數。
(4)將這個二進制實數化為十進制,並根據第31位是「0」還是「1」加上正號或負號即可。
3、浮點型的減法運算
浮點加減運算過程比定點運算過程復雜。完成浮點加減運算的操作過程大體分為四步:
(1) 0操作數的檢查;
如果判斷兩個需要加減的浮點數有一個為0,即可得知運算結果而沒有必要再進行有序的一些列操作。
(2) 比較階碼(指數位)大小並完成對階;
兩浮點數進行加減,首先要看兩數的指數位是否相同,即小數點位置是否對齊。若兩數指數位相同,表示小數點是對齊的,就可以進行尾數的加減運算。反之,若兩數階碼不同,表示小數點位置沒有對齊,此時必須使兩數的階碼相同,這個過程叫做對階。
如何對階(假設兩浮點數的指數位為Ex和 Ey):
通過尾數的移位以改變Ex或 Ey,使之相等。 由於浮點表示的數多是規格化的,尾數左移會引起最高有位的丟失,造成很大誤差;而尾數右移雖引起最低有效位的丟失,但造成的誤差較小,因此,對階操作規定使尾數右移,尾數右移後使階碼作相應增加,其數值保持不變。很顯然,一個增加後的階碼與另一個相等,所增加的階碼一定是小階。因此在對階時,總是使小階向大階看齊,即小階的尾數向右移位( 相當於小數點左移 ) ,每右移一位,其階碼加 1 ,直到兩數的階碼相等為止,右移的位數等於階差 △E。
(3) 尾數(有效數位)進行加或減運算;
對階完畢後就可有效數位求和。 不論是加法運算還是減法運算,都按加法進行操作,其方法與定點加減運算完全一樣。
(4) 結果規格化並進行舍入處理。
略
4、 計算12.0f-11.9f
12.0f 的內存存儲格式為:
11.9f 的內存存儲格式為:
可見兩數的指數位完全相同,只要對有效數位進行減法即可。
12.0f-11.9f 結果:
將結果還原為十進制為: 0.00011001100110011010=0.10000038
詳細的分析
由於對float或double 的使用不當,可能會出現精度丟失的問題。問題大概情況可以通過如下代碼理解:
view plain to clipboardprint?
public class FloatDoubleTest {
public static void main(String[] args) {
float f = 20014999;
double d = f;
double d2 = 20014999;
System.out.println("f=" + f);
System.out.println("d=" + d);
System.out.println("d2=" + d2);
}
}
public class FloatDoubleTest {
public static void main(String[] args) {
float f = 20014999;
double d = f;
double d2 = 20014999;
System.out.println("f=" + f);
System.out.println("d=" + d);
System.out.println("d2=" + d2);
}
}
得到的結果如下:
f=2.0015E7
d=2.0015E7
d2=2.0014999E7
從輸出結果可以看出double 可以正確的表示20014999 ,而float 沒有辦法表示20014999 ,得到的只是一個近似值。這樣的結果很讓人訝異。20014999 這么小的數字在float下沒辦法表示。於是帶著這個問題,做了一次關於float和double學習,做個簡單分享,希望有助於大家對java 浮點數的理解。
關於 java 的 float 和 double
Java 語言支持兩種基本的浮點類型: float 和 double 。java 的浮點類型都依據 IEEE 754 標准。IEEE 754 定義了32 位和 64 位雙精度兩種浮點二進制小數標准。
IEEE 754 用科學記數法以底數為 2 的小數來表示浮點數。32 位浮點數用 1 位表示數字的符號,用 8 位來表示指數,用 23 位來表示尾數,即小數部分。作為有符號整數的指數可以有正負之分。小數部分用二進制(底數 2 )小數來表示。對於64 位雙精度浮點數,用 1 位表示數字的符號,用 11 位表示指數,52 位表示尾數
⑥ C語言:浮點數變為整數的一個疑惑
因為你的a做了顯式轉換也還是有浮點數的形式的,但值確實是變成3了,關鍵在於雙精度浮點數和整型數的差別和printf函數採用的棧輸出結構;浮點型的位數比整型高,所以a輸入進去以後,有效位數較雙精度浮點數較小,因此存在著一堆0值,如:00000000003.1428570000,00000000000003,然而在讀時你採用整型,根據編譯器的差別可能只讀前8位或前四位,你這個數前面那麼多0,%d讀出來的肯定也是0嘛。其次,int(a)是c++的整型析構函數((int)a才是強制轉換(我說的顯示轉換)),作用是直接提取a的整數部分,用這個做浮點數取整還准確一些,推薦用int(a)以%d輸出即可。
⑦ 怎麼將c語言中一個浮點型數據的整數部分與小數部分提取出來
代碼如下:
#include <stdio.h>
int main(){
double number; //其中number表示輸入的數
int zhengshu; //表示實數的整數部分
double xiaoshu; //表示整數的小數部分
printf("請輸入一個實數:"); //提示輸入一個數
scanf("%lf",&number);
zhengshu = (int)number;
xiaoshu = number-zhengshu;
printf("%f整數部分為:%d,小數部分為:%f ",number,zhengshu,xiaoshu);
return 0;
}。
程序執行結果:
程序設計思路就是輸入一個浮點數,把這個浮點強轉為整數,C語言強制轉換浮點數為整數的話,會丟失精度,也就是小數部分,再把原來的數減去整數部分,就可以得到小數部分,然後定義變數把相應的部分存儲,列印出來就行了。
⑧ C語言怎麼控制浮點數的輸出位數
在c語言中可以通過精度限定符來控制浮點數輸出的位數,精度限定符有一個點號後跟一個整數組成。其准確含義依賴於它所修飾的數據類型。示例如下:
#include<stdio.h>
intmain()
{
printf("%.2lf ",1.2345678);
return0;
}
⑨ C語言中對於浮點數進行(int)轉換時,計算機是按照四捨五入呢還是只取整數部分
是只取整數部分的。
也就是,可能是1.999999999
然後轉換為int就是1,所以
浮點數向int轉換,會丟失精度。
為了避免這個,建議如果想取到整數部分。
可以使用
float b;
int a;
a=(b+0.5);
這樣寫的話,就是四捨五入。
如果
寫成
a=b.
可能有
0.99999999999
被截斷,
a就是0的情況。
⑩ C語言中float型數據怎麼 取整數部分演算法 或取小數部分
分析如下:
一種簡單的辦法是直接強制轉換到int型就是整數部分。減去這個int型就是小數部分了。
代碼如下:
float n=12.223;
int x=(int)n;
float y=n-(float)x;
得出的x為數據的整數部分,y為數據的小數部分。
拓展資料:
浮點型數據類型,FLOAT 數據類型用於存儲單精度浮點數或雙精度浮點數。浮點數使用IEEE(電氣和電子工程師協會)格式。浮點類型的單精度值具有 4 個位元組,包括一個符號位、一個 8 位 excess-127 二進制指數和一個 23 位尾數。尾數表示一個介於 1.0 和 2.0 之間的數。由於尾數的高順序位始終為 1,因此它不是以數字形式存儲的。此表示形式為 float 類型提供了一個大約在-3.4E+38 和 3.4E+38 之間的范圍。
(資料來源:網路:FLOAT)