一、版本间的区别
在 5.2 及 之前版本,只有 双精度 浮点格式。
在 5.3 之后,开始有 64 位整数和 float 双精度浮点类型。
lua 5.3 之后版本也可以编译为 精简 Lua 模式,该模式中使用 32 位整数 和 单精度浮点类型 。
双精度浮点类型能表示 2^53 整型数值。
精简 Lua 和标准 Lua 源码一样,除了数值表示占用的字节不一样,其余完全一致。可以通过
LUA_32BITS 进行定义(luaconf.h 文件)
二、整型和浮点型
lua 中,无论是 “浮点数” 还是 “整数” 都是 number 类型。 两者都可以进行转换。
如果真的需要区分整数和浮点数,则需要通过 math.type(xxx)
进行获取
print(math.type(3)) --> integer
print(math.type(3.0)) --> float
print(math.type(3e10)) --> float
type(3) --> number
type(3.0) --> number
具有 十进制小数 或者 指数的数值 都会被当作 浮点型值 ,否则会被当作整型值。
三、十六进制浮点数
lua 5.2 之后引入支持 十六进制浮点数
十六进制浮点数由小数部分和 以 p 和 P 开头的指数部分组成。
print(0x0.2) --> 0.125
print(0x1p-1) --> 0.5
print(0xa.bp2) --> 42.75
可以使用 string.format("%a", number)
进行十六进制浮点数的格式化输出。
这种格式的阅读难,但是可以保留所有的浮点数精度,并且比十进制的转换速度更快。
string.format("%a", 419) --> 0x1.a3p+8
string.format("%a", 0.1) --> 0x1.999999999999ap-4
四、数值运算通用规则
和 java、kotlin 类似,只要运算的数值中有一个为 float ,则结果为 float ,否则结果为 integer 。
五、数值除法
因为两个整数相除有可能产生小数,所以在 lua 中,所有的除法运算操作永远是浮点数并且产生浮点型值
这点和 java、kotlin 不同,大概是因为 lua 数值型不区分 integer 和 float ,存在兼容意义
print(3 / 2) --> 1.5
print(3.0 / 2.0) --> 1.5
print(4 / 2) --> 2.0
六、floor 除法 运算符 //
float 除法会对得到的商向负无穷取整,数值的类型保持不变,如果结果是 float 就是 float,是 integer 就是 integer(符合通用规则)
print(3 // 2) --> 1
print(3.0 // 2) --> 1.0
print(6 // 2) --> 3
print(6.0 // 2.0) --> 3.0
print(-9 // 2) --> -5
print(1.5 // 0.5) --> 3.0
七、取模
如果操作数是整数,那么取模运算的结果也是整数。(符合通用规则)下面两种表达式效果一致
a % b == a - ((a // b) * b)
对于任意正常量 K ,即使 x 是负数,表达式 x % K
的结果永远在 [0, K-1] 之间。
print(-15 % 2) --> 1
可以使用 x = x - x % 0.01
进行保留有效小数点数
print(pi - pi %