浮点型是可以包含小数部分的数值,浮点型比整型的表数范围更大,可以存储比Long更大或更小的数。Kotlin的浮点型有两种。
- Float:表示32位的浮点型,当精度要求不高时可以使用此种类型。
- Double:表示64位的双精度浮点型,当程序要求存储很大或者高精度的浮点数时使用这种类型。
Kotlin的浮点数有2种表示形式。
- 十进制数形式:这种形式就是平常简单的浮点数,例如5.12、512.0、0.512。浮点数必须包含一个小数点,否则会被当成整数类型处理。
- 科学计数形式:例如5.12e2(即5.12*102)、5.12E2(也是5.12*102)。
必须指出的是,只有浮点型的数值才可以使用科学计数形式表示。例如51200是一个Int型的值,但512E2则是浮点型的值。
如果声明一个常量或变量时没有指定数据类型,只是简单地指定了其初始值为浮点值,那么Kotlin会自动判断该变量的类型为Double。
除此之外,Kotlin还提供了3个特殊的浮点型数值:正无穷大、负无穷大和非数。例如,使用一个正数除以0.0将得到正无穷大数值,使用一个负数除以0.0将得到负无穷大数值,0.0除以0.0或对负数开方将得到一个非数。
需要指出的是,所有的正无穷大数值都相等,所有的负无穷大数值都相等;而非数不与任何数值相等,甚至和非数自己都不相等。
注意:只有浮点数除以0.0才可以得到正无穷大数值或负无穷大数值,但如果使用整型值除以整数0将会引起编译错误:division by zero(除0错误)。
下面程序示范了上面介绍的关于浮点数的各个知识点。
程序清单:codes\02\2.4\FloatTest.kt
fun main(args: Array<String>) {
var af1 =
// 下面将看到af1的值已经发生了改变
println("af1的值为:${af1}")
// 声明af是Float类型,但25.2345值默认是Double类型,因此下面代码编译时报错
var af2: Float = 25.2345
// f1的类型被推断为Double
var f1 = 5.12e2
println("f1的值为:${f1}")
var a = 0.0
// 5.0除以0.0将出现正无穷大数值
println("5.0/a的值为:${5.0 / a}")
// 所有的正无穷大数值都相等,所以下面将会输出true
println(5.0 / a == 50000 / 0.0)
// -5.0除以0.0将出现负无穷大数值
println("-5.0/a的值为:${-5.0 / a}")
// 所有的负无穷大数值都相等,所以下面将会输出true
println(-5.0 / a == -50000 / 0.0)
// 0.0除以0.0将出现非数
var nan : Double = a / a
println("a/a的值为:${nan}")
// 非数与自己都不相等,所以下面将会输出false
println(nan == nan)
}