一. number类型
1. Lua5.3 版本开始, Lua 语言为数值格式提供了两种选择 :integer( 整型 )和float(双精度浮点型 )[float不代表单精度类型 ]
2. 默认当成双精度浮点类型来运算的。也就是说number会底层当做double类型来处理,精度是16~17位
3. 十进制
① 十进制表示方式
--十进制表示 local a = 2 --输出结果: 2 local b = 2.1 --输出结果: 2.1
② 十进制科学计数法表示方式(科学记数法的结果是一个浮点数)
--[[ 科学计数法规则: 1. 数字后面加e或者E字符然后跟数值(数值不能省略) 表示科学计数法 2. 数值的正数表示小数点后移,数值的负数表示小数点往前移 --]] print(4.57e0) --输出结果: 4.57 print(0.3e12) --输出结果: 300000000000.0 print(0.3e+12) --输出结果: 300000000000.0(与上面的表达式一样) print(5.26E+20) --输出结果: 526E+020(数值过大无法转换,但也能表示十进制数)
4. 十六进制
① 以0x开头的十六进制常量, 不仅支持十六进制的整型、还支持十六进制的浮点数
--十六进制表示方式输出的结果是十进制 local e = 0xa2548 --输出结果: 9544 local f = 0x2.5 --输出结果: 2.3125 local g = 0xa.5 --输出结果: 10.3125
② 十六进制还可以由p或P开头的指数部分组成
--十六进制科学计数法表示输出结果是十进制 --p表示什么不必深究 local h = 0x2.ap3 --输出结果: 21.0 --通过string.format()的%a参数可以对上面的这种格式进行格式化的输出,格式化的意思是: 有格式 --虽然这种格式很难阅读,但是这种格式可以保留所有浮点数的精度,并且比十进制的转换速度更快 print(string.format("%a", 419)) --0x1.a3p+8 print(string.format("%a", 0.5)) --0x1p-1 print(0x1.a3p+8) --输出结果: 419
5. 十六进制与十进制互转
--十六进制转十进制--一字节 print(0x01) --输出结果: 1 print(0xFF) --输出结果: 255 --二字节 print(0xFF01) --输出结果: 65281 print(0xFFFF) --输出结果: 65535 --四字节 print(0xA0AA0A) --输出结果: 10529290 print(0xFFFFFF) --输出结果: 16777215 --十进制转十六进制 local function dec(decnum) local num = tonumber(decnum) if not num then return nil end if not math.type(num) == "integer" then return nil end local hex,dis,rem = "",num repeat dis, rem = math.modf(dis/16), math.fmod(dis,16) rem = rem > 9 and string.char(rem+55) or rem hex = rem .. hex until dis == 0 return "0x" .. hex end print(dec(65535))
5. math.type(参数), 判断是否为int或者float
--[[ math.type判断是否是int或者float 语法: math.type(参数) 功能: 判断是否是int或者float 参数: 参数: 数值,不是数值返回nil 返回值: 字符串型, "integer", "float" --]] print(math.type(1)) --输出结果: intger print(math.type(-1.5)) --输出结果: float
二. 算数运算符
1. Lua支持的算术运算
① 加(+)、减(-)、乘(*)、除(/)
② 取负数(-)
③ 取整除法和floor除法(//)
④ 取余(%)
⑤ 指数运算(e和p)
⑥ 幂运算(^)
2. 整型值和浮点型值之间的算术运算
① 在对一个字符串进行算术操作时,Lua会尝试将这个字符串转换为一个数字来进行算数操作(结果是浮点数)
② 当两个操作数的类型不同时,运算之前会先将整型值转换为浮点型值
print(13 + 15) --结果是整数型 print(13.0 + 15) --结果是浮点数型 print(13 + 15.0) --结果是浮点数型 print(13.0 + 15.0) --结果是浮点数型 print(1 * 2) --结果是整数型 print(1 * 2.0) --结果是浮点数型
③ / 的注意事项: 由于两个整数相处并不一定是整数,因此当两个数进行相除时,interger都会转换为浮点数(即使两个操作数都是整数液转换,并且除法运算的结果也是浮点数
④ // 和 math.floor注意事项: 向左取整 // 向左取整时如果两个数组有浮点数则结果是浮点数 math.floor向左取整则不会出现浮点数
print(2.5 // 1) --输出结果: 2.0 print(-2.5 // 1) --输出结果: -3.0 print(math.floor(2.5)) --输出结果: 2 print(math.floor(-2.5)) --输出结果: -3
⑤ 取负数运算(如果两个操作数都是整型值则返回整型;否则返回浮点数)
print(-(-1)) --输出结果: 1 print(-(1)) --输出结果: -1 print(-(3 * 6.0)) --输出结果: -18.0
⑥ 取余运算(如果两个操作数都是整型值则返回整型;否则返回浮点数)
local a = 11 local b = 2 print( a % b == a - ((a // b) * b) ) --输出结果: true --取余运算可以对数值保留n位小数(一般不用这种方式) x = math.pi print(x - x % 0.1) --保留1位小数 print(x - x % 0.01) --保留2位小数
⑦ 幂运算: 幂运算的操作数和结果也永远是浮点类型, 使用x^0.5来计算x的平方根,使用x^(1/3)来计算x的立方根
三. 关系运算符
1. Lua支持的关系运算符如下
①大于(>)、小于(<)
②大于等于(>=)、小于等于(<=)
③相等(==)
④不相等(~=)
2. Lua关系运算的结果都是boolean类型
3. ==、~=说明:这两个运算符可以应用于任意两个值,当这两个值的类型不同时,Lua语言认为它们是不相等的;否则,会根据它们的类型再对两者进行比较
4. Lua通过引用比较tables、userdata、functions。也就是说两者表示同一个对象时相等
print(1 == 2) --输出结果: false print(1 == 1) --输出结果: true -- 类型不同, 直接返回false, 根本不进行比较 print(1 == "1") --输出结果: false print("1" == "1") --输出结果: true print("1" == "2") --输出结果: false --布尔值与nil比较 print(false ~= nil) -- true --数组比较 a = { 1, 2 } b = { 1, 2 } c = a print(a == b) --false print(a == c) --true
5. 比较数值时永远忽略数值的子类型,数值究竟是以整型还是浮点型表示并无区别,只与算术值有关(尽管如此,比较具有相同子类型的数值时效率更高)
print(1.0 == 1) --输出结果: true print(1 == 1) --输出结果: true print(1.1 == 1) --输出结果: false
6. > < >= <=
--字符串比较(必须两边都是字符串否则会报错) print("a">"b") --false --"12"和"2"比较时,按照字母顺序比较的时候,首先是字符"1"和字符"2"进行比较,1大于2为false,则忽略后面的比较操作,直接返回false print("12" > "2") --false
--比较大小的错误示范 print(true > 1) --报错,类型不同 print("1" > 1) --报错,类型不同
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/288634.html