浮點(diǎn)類型有兩種表示方式:
(1)Float:表示32位的浮點(diǎn)類型赖钞,可以精確到小數(shù)點(diǎn)后6位亩歹。
(2)Double:表示64位的浮點(diǎn)類型秋泄,可以精確到小數(shù)點(diǎn)后15位晦溪。
let f: Float = 0.123456789
let d: Double = 0.1234567890123456789
具體選用哪種浮點(diǎn)類型,取決于所存儲的浮點(diǎn)數(shù)的范圍。通常情況下萍诱,推薦使用Double悬嗓。
如果聲明浮點(diǎn)類型的變量或常量時(shí)不指定具體的數(shù)據(jù)類型,系統(tǒng)默認(rèn)將該變量或常量的數(shù)據(jù)類型推斷為Double砂沛。
let fp = 0.12345
// let fp: Double = 0.12345
浮點(diǎn)類型的直接數(shù)有兩種指數(shù)表示形式:
(1)10進(jìn)制的指數(shù)表示形式
以e作為底數(shù)烫扼,例如:men = m乘以10的n次方
(2)16進(jìn)制的指數(shù)表示形式
以p作為底數(shù)曙求,例如:0xmpn = m對應(yīng)的十進(jìn)制數(shù)乘以2的n次方
let decimalDouble = 0.380859375
// 380.859375乘以10的-3次方
let exponentDecimalDouble = 380.859375e-3
// (12 + 3 / 16)乘以2的-5次方
let exponentHexadecimalDouble = 0xC.3p-5
/*
可以給浮點(diǎn)類型的直接數(shù)添加若干個(gè)0或_碍庵,以提高其可讀性。
*/
let readableDouble = 001_023_456.007_018_090
/*
計(jì)算機(jī)存儲浮點(diǎn)數(shù)時(shí)是不準(zhǔn)確的悟狱,因此静浴,對于浮點(diǎn)數(shù)的比較需要格外小心。
*/
let db = 1.1
// 1.2很可能是:1.19999999999999
db + 0.1 == 1.2
/*
比較兩個(gè)浮點(diǎn)數(shù)是否相等時(shí)挤渐,比較可靠的做法是:比較其差的絕對值是否小于一個(gè)非常小的數(shù)值苹享。
*/
abs(db + 0.1 - 1.2) < 0.00000000000001
如果把兩個(gè)不同浮點(diǎn)類型的變量或常量進(jìn)行運(yùn)算(包括賦值運(yùn)算、算術(shù)運(yùn)算和比較運(yùn)算)浴麻,必須顯式地將其轉(zhuǎn)換為相同的浮點(diǎn)類型得问,否則會編譯出錯(cuò)。
var f: Float = 18.0
var d: Double = 23.0
// 把兩個(gè)不同浮點(diǎn)類型的變量進(jìn)行賦值運(yùn)算
// f = d
// d = f
// 必須顯式地將其轉(zhuǎn)換為相同的浮點(diǎn)類型
d = Double(f)
f = Float(d)
// 把兩個(gè)不同浮點(diǎn)類型的變量進(jìn)行算術(shù)運(yùn)算
// f + d
// 必須顯式地將其轉(zhuǎn)換為相同的浮點(diǎn)類型
Double(f) + d
f + Float(d)
// 把兩個(gè)不同浮點(diǎn)類型的變量進(jìn)行比較運(yùn)算
// f > d
// 必須顯式地將其轉(zhuǎn)換為相同的浮點(diǎn)類型
Double(f) > d
f > Float(d)
整數(shù)類型和浮點(diǎn)類型運(yùn)算時(shí)的相互轉(zhuǎn)換
如果把整數(shù)類型和浮點(diǎn)類型的變量或常量進(jìn)行運(yùn)算(包括賦值運(yùn)算软免、算術(shù)運(yùn)算和比較運(yùn)算)宫纬,必須顯式地將其轉(zhuǎn)換為相同的類型,否則會編譯出錯(cuò)膏萧。
當(dāng)把浮點(diǎn)類型轉(zhuǎn)換成整數(shù)類型時(shí)漓骚,在該浮點(diǎn)類型的值不超出該整數(shù)類型所表示數(shù)值范圍的前提下,浮點(diǎn)類型的值的小數(shù)部分會被截掉榛泛。
var i8: Int8 = 23
var d: Double = 7.98
// 把整數(shù)類型和浮點(diǎn)類型的變量進(jìn)行賦值運(yùn)算
// d = i8
// i8 = d
// 必須顯式地將其轉(zhuǎn)換為相同的類型
d = Double(i8)
d = 7.98
i8 = Int8(d)
// 把整數(shù)類型和浮點(diǎn)類型的變量進(jìn)行算術(shù)運(yùn)算
// i8 + d
// 必須顯式地將其轉(zhuǎn)換為相同的類型
d + Double(i8)
i8 + Int8(d)
// 把整數(shù)類型和浮點(diǎn)類型的變量進(jìn)行比較運(yùn)算
// i8 > d
// 必須顯式地將其轉(zhuǎn)換為相同的類型
d > Double(i8)
i8 > Int8(d)
/*
在進(jìn)行顯式類型轉(zhuǎn)換時(shí)蝌蹂,如果被轉(zhuǎn)換的變量或常量的值超出了轉(zhuǎn)換后的數(shù)據(jù)類型所能表示的數(shù)值范圍,程序是可以編譯通過的曹锨,但是運(yùn)行時(shí)會出錯(cuò)孤个。
*/
d = 798.0
// 被轉(zhuǎn)換的變量的值798.0超出了轉(zhuǎn)換后的數(shù)據(jù)類型Int8所能表示的數(shù)值范圍
// Int8(d)
/*
直接數(shù)沒有明確的數(shù)據(jù)類型,直接數(shù)的數(shù)據(jù)類型在編譯時(shí)才會被推斷出來沛简。
可以把整數(shù)類型的直接數(shù)直接賦值給浮點(diǎn)類型的變量或常量硼身,也可以把整數(shù)類型的直接數(shù)和浮點(diǎn)類型的直接數(shù)直接運(yùn)算。
*/
let fp: Double = 10
10 / 3.0