官术网_书友最值得收藏!

2.6 浮點(diǎn)數(shù)

除了整數(shù),代碼中使用的另一種基本數(shù)據(jù)類型就是浮點(diǎn)型,它用于處理包含小數(shù)部分的數(shù)據(jù)。在Objective-C中,常用的浮點(diǎn)數(shù)類型包括float和double,其中:

? float稱為單精度浮點(diǎn)數(shù),在NSLog()函數(shù)中的格式化字符為“%f ”,我們還可以使用特殊的格式顯示浮點(diǎn)數(shù),比如使用“%e”會(huì)以科學(xué)計(jì)數(shù)法顯示浮點(diǎn)數(shù)。

? double稱為雙精度浮點(diǎn)數(shù),其處理數(shù)據(jù)范圍更大,在NSLog()函數(shù)中的格式化字符為“%Lf ”。

此外,在Foundation框架(Core Graphics)中,定義了浮點(diǎn)數(shù)類型的別名,如CGFloat類型在64位平臺(tái)下定義為double類型的別名,而在32位環(huán)境下定義為float類型的別名。

開發(fā)過程中,可能經(jīng)常需要在整數(shù)和浮點(diǎn)數(shù)類型之間進(jìn)行轉(zhuǎn)換,接下來,我們就以int和double類型為例討論整數(shù)與浮點(diǎn)數(shù)之間的轉(zhuǎn)換問題。

首先,從整數(shù)類型到浮點(diǎn)數(shù)類型的轉(zhuǎn)換是沒有問題的,直接賦值就可以了,如下面的代碼。

    int iNum = 100;
    double fNum = iNum;

代碼中,整數(shù)實(shí)際上是隱式轉(zhuǎn)換為浮點(diǎn)數(shù),因?yàn)閐ouble類型比int類型的取值范圍大,所以,這種隱式的轉(zhuǎn)換是沒有問題的。

反過來,當(dāng)我們需要將double類型轉(zhuǎn)換為int類型時(shí)就要注意:小數(shù)部分會(huì)丟失,這一點(diǎn)并不難理解,因?yàn)檎麛?shù)不能保存小數(shù)部分。如果下定決定這么做,可以使用強(qiáng)制轉(zhuǎn)換明確進(jìn)行轉(zhuǎn)換的決心,如下面的代碼。

    double fNum = 100.56;
    int iNum = (int)fNum;

代碼中,我們在需要轉(zhuǎn)換的數(shù)據(jù)前使用了一對圓括號(hào),其中的數(shù)據(jù)類型就是轉(zhuǎn)換操作的目標(biāo)類型,這種數(shù)據(jù)類型轉(zhuǎn)換方式就稱為強(qiáng)制轉(zhuǎn)換。

浮點(diǎn)數(shù)進(jìn)行算術(shù)運(yùn)算時(shí),可以使用加法、減法、乘法和除法運(yùn)算符,而且,兩個(gè)浮點(diǎn)數(shù)運(yùn)算的結(jié)果依然是浮點(diǎn)數(shù)。在這些運(yùn)算中,如果混合有浮點(diǎn)數(shù)和整數(shù),會(huì)自動(dòng)將整數(shù)轉(zhuǎn)換為浮點(diǎn)數(shù)以后計(jì)算,計(jì)算結(jié)果同樣為浮點(diǎn)數(shù)。對于取余運(yùn)算,則會(huì)將浮點(diǎn)數(shù)自動(dòng)轉(zhuǎn)換為整數(shù)后計(jì)算,也就是說,在Objective-C中,浮點(diǎn)數(shù)不能進(jìn)行取余運(yùn)算。

下面的代碼演示了浮點(diǎn)數(shù)的算術(shù)運(yùn)算。

    double x = 10.56 , y = 3.0;
    NSLog(@"x + y = %Lf", x + y);  // 13.56
    NSLog(@"x - y = %Lf", x - y);  // 7.56
    NSLog(@"x * y = %Lf", x * y);  // 31.68
    NSLog(@"x / y = %Lf", x / y);  // 3.52
    NSLog(@"x % y = %Lf", x % y);  // 1

接下來的一個(gè)問題,我們應(yīng)該如何處理丟失的小數(shù)部分?

默認(rèn)情況下,浮點(diǎn)數(shù)在轉(zhuǎn)換成整數(shù)時(shí),會(huì)直接舍棄小數(shù)部分。不過,我們也可以自己做一點(diǎn)點(diǎn)決定,可以參考下面幾個(gè)函數(shù)處理浮點(diǎn)數(shù)。

? floorf()函數(shù),舍去參數(shù)中的小數(shù)部分,只返回整數(shù)部分,請注意,此函數(shù)的參數(shù)和返回結(jié)果都是float類型,如果需要整數(shù)類型,還是需要進(jìn)行轉(zhuǎn)換操作。如果操作double類型,則使用floor()函數(shù)。

? ceilf()函數(shù),舍去參數(shù)中的小數(shù)部分,整數(shù)部分加1,此函數(shù)的參數(shù)和返回值同樣為float類型;相應(yīng)的操作double類型的函數(shù)是ceil()。

最后放松一下,我們算一算月球的腰圍,即月球赤道的長度,如下面的代碼。

    double r = 1738.0;
    double circumference = r * 2 * M_PI;
    NSLog(@"月亮半徑為%Lf km,其周長為%Lf km", r,  circumference);
主站蜘蛛池模板: 万年县| 鸡东县| 达州市| 武安市| 洮南市| 福泉市| 青冈县| 德阳市| 治多县| 大足县| 梅河口市| 布拖县| 鲁山县| 益阳市| 琼中| 金乡县| 东平县| 淮南市| 大英县| 都昌县| 綦江县| 泾阳县| 海丰县| 南投县| 镇平县| 天长市| 三原县| 濉溪县| 泽州县| 高要市| 昭通市| 平度市| 长乐市| 富阳市| 云安县| 衡山县| 新龙县| 勃利县| 平湖市| 望奎县| 重庆市|