在 Lua
语言中,数值有两种表示方式,即常规表示方式和科学计数法表示方式。
科学计数法的表示方式为:一个可选的十进制部分外加一个可选的十进制指数部分。
> 4 --> 4 > 0.4 --> 0.4 > 4.57e-3 --> 0.00457 > 0.3e12 --> 300000000000.0 > 5E+20 --> 5e+20
具有十进制小数或者指数的数值会被当做浮点型值,否则会被当做整型值。
整型值和浮点型值的类型都是 number
:
> type(3) --> number > type(3.5) --> number > type(3.0) --> number
由于整型值和浮点型值的类型都是 number
,所以他们是可以相互转换的。同时,具有相同算数值的整型值和浮点型值在 Lua
语言中是相等的。
思考
在很多语言中浮点型和整型的存储方式是不同的,所以一般也是不相等的,那么 Lua
中是如何存储的,又为什么会判定为相等呢?
> 1 == 1.0 --> true > -3 == -3.0 --> true > 0.2e3 == 200 --> true
在少数情况下,当需要区分整型值和浮点型值的时候,可以使用函数 math.type()
来判断,如下所示:
> math.type(3) --> integer > math.type(3.0) --> float
在 Lua5.3
中:
> 3 --> 3 > 3.0 --> 3.0 > 1000 --> 1000 > 1e3 --> 1000.0
十六进制常量
Lua
语言像其他语言一样,也支持以 0x
开头的十六进制常量。同时,与很多编程语言不同的是:Lua语言还支持十六进制的浮点数,这种十六进制浮点数由小数部分和以 p
或 P
开头的指数部分组成。如下所示:
> 0xff --> 255 > 0x1A3 --> 419 > 0x0.2 --> 0.125 > 0x1p-1 --> 0.5 > 0xa.bp2 --> 42.75
提示
十六进制小数是从 Lua5.2
开始被引入。
可以使用%a参数,通过函数string.format()对这种格式进行格式化输出:
> string.format("%a", 419) --> 0x1.a3p+8 > string.format("%a", 0.1) --> 0x1.999999999999ap-4
虽然这种格式很难阅读,但是这种格式可以保留所有浮点数的精度,并且比十进制的转换速度更快。