L04. number类型


一. 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

(0)
上一篇 2022年9月10日
下一篇 2022年9月10日

相关推荐

发表回复

登录后才能评论