浮点类型有两种表示方式:
(1)Float:表示32位的浮点类型,可以精确到小数点后6位。
(2)Double:表示64位的浮点类型,可以精确到小数点后15位。
let f: Float = 0.123456789
let d: Double = 0.1234567890123456789
具体选用哪种浮点类型,取决于所存储的浮点数的范围。通常情况下,推荐使用Double。
如果声明浮点类型的变量或常量时不指定具体的数据类型,系统默认将该变量或常量的数据类型推断为Double。
let fp = 0.12345
// let fp: Double = 0.12345
浮点类型的直接数有两种指数表示形式:
(1)10进制的指数表示形式
以e作为底数,例如:men = m乘以10的n次方
(2)16进制的指数表示形式
以p作为底数,例如:0xmpn = m对应的十进制数乘以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
/*
可以给浮点类型的直接数添加若干个0或_,以提高其可读性。
*/
let readableDouble = 001_023_456.007_018_090
/*
计算机存储浮点数时是不准确的,因此,对于浮点数的比较需要格外小心。
*/
let db = 1.1
// 1.2很可能是:1.19999999999999
db + 0.1 == 1.2
/*
比较两个浮点数是否相等时,比较可靠的做法是:比较其差的绝对值是否小于一个非常小的数值。
*/
abs(db + 0.1 - 1.2) < 0.00000000000001
如果把两个不同浮点类型的变量或常量进行运算(包括赋值运算、算术运算和比较运算),必须显式地将其转换为相同的浮点类型,否则会编译出错。
var f: Float = 18.0
var d: Double = 23.0
// 把两个不同浮点类型的变量进行赋值运算
// f = d
// d = f
// 必须显式地将其转换为相同的浮点类型
d = Double(f)
f = Float(d)
// 把两个不同浮点类型的变量进行算术运算
// f + d
// 必须显式地将其转换为相同的浮点类型
Double(f) + d
f + Float(d)
// 把两个不同浮点类型的变量进行比较运算
// f > d
// 必须显式地将其转换为相同的浮点类型
Double(f) > d
f > Float(d)
整数类型和浮点类型运算时的相互转换
如果把整数类型和浮点类型的变量或常量进行运算(包括赋值运算、算术运算和比较运算),必须显式地将其转换为相同的类型,否则会编译出错。
当把浮点类型转换成整数类型时,在该浮点类型的值不超出该整数类型所表示数值范围的前提下,浮点类型的值的小数部分会被截掉。
var i8: Int8 = 23
var d: Double = 7.98
// 把整数类型和浮点类型的变量进行赋值运算
// d = i8
// i8 = d
// 必须显式地将其转换为相同的类型
d = Double(i8)
d = 7.98
i8 = Int8(d)
// 把整数类型和浮点类型的变量进行算术运算
// i8 + d
// 必须显式地将其转换为相同的类型
d + Double(i8)
i8 + Int8(d)
// 把整数类型和浮点类型的变量进行比较运算
// i8 > d
// 必须显式地将其转换为相同的类型
d > Double(i8)
i8 > Int8(d)
/*
在进行显式类型转换时,如果被转换的变量或常量的值超出了转换后的数据类型所能表示的数值范围,程序是可以编译通过的,但是运行时会出错。
*/
d = 798.0
// 被转换的变量的值798.0超出了转换后的数据类型Int8所能表示的数值范围
// Int8(d)
/*
直接数没有明确的数据类型,直接数的数据类型在编译时才会被推断出来。
可以把整数类型的直接数直接赋值给浮点类型的变量或常量,也可以把整数类型的直接数和浮点类型的直接数直接运算。
*/
let fp: Double = 10
10 / 3.0