Lua 数据类型 —— 数值

一、版本间的区别

在 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 % 
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值