2.数值

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_25327609/article/details/85699500

数值

Lua5.3语言为数值类型提供了两种选择:被称为integer的64位整形和被称为float的双精度浮点型(没错,双精度)。

数值常量

能看到的数字都是常量,可以用科学计数法(e,E),具有十进制小数点的数据和指数的数据会被当做浮点型数值,否则当做整型值。
注意
    由于整型值和浮点型值类型都是number,所以可以互相转换,并且具有相同算术值的整型值和浮点型值在Lua语言中是相等的。

print(1==1.0)
print(200==0.2e3)
--输出
true
true

极少情况下区分整型值和浮点型,使用math.type

print(type(1))
print(type(1.0))
print(math.type(1))
print(math.type(1.0))
--输出
number
number
integer
float

Lua同样支持0x开头的十六进制常量,同时还支持十六进制的浮点数,由十六进制的浮点数和以p或P开头的指数组成。

--p表示2的次方数  如下 1*2^8=256
print(0x1p8)
--输出
256.0

通过string.format函数使用%a参数,对数据进行格式化输出为十六进制的浮点数。

print(string.format("%a",256))
--输出
0x1p+8

算术运算

两个整型值运算的结果也为整型(不能整除时两个整数相除会产生浮点数),其他情况下结果为浮点型。
float除法 (//) 对商向负无穷取整,同时操作数为整数则结果为整数,否则为浮点数。
取模运算 定义 a%b == a-((a//b)*b) 同样操作数为整数则结果为整数,否则为浮点数。
    对于整数而言,取模结果的符号与第二个操作数一致,特别地,当任意指定正整数K,即使x为负数,x%K的结果也永远在[0,K-1]之间。
    对于浮点型而言,x-x%0.01即为x保留两位小数的结果(x-x%0.001即为保留三位)
幂运算 使用^符号,其结果永远是浮点数。

关系运算符

其结果都是Boolean,其中不等于使用**=**,==与=两者可以应用于任何值,当两个值的类型不同是,认为不相同,否则再对两者进行比较(比较数值时,忽略子类型,不过相同子类型效率更高)

数学库

提供了标准数学库math,包含三角函数(sin,cos,tan,asin等)(使用弧度为单位,通过deg和rad转换),指数函数,取整函数,最大(max)最小值(min)函数,用于生成伪随机数(random)以及常量pi和huge(最大可表示数值,在大多数平台上代表inf)
随机数发生器
math.random用于生成伪随机数。

  1. 不带参数调用,返回[0,1]范围内均匀分布的伪随机实数;
  2. 带有一个整型n时,返回[1,n]范围内的伪随机整数;
  3. 带有整数值l,u调用时,返回[l,u]范围内的伪随机整数。
    函数randomseed用于设置伪随机数发生器的种子,唯一参数就是数值类型的种子。默认使用1,一般使用系统时间作为种子。
math.randomseed(os.time())

取整函数
当取整结果能够用整型表示时,返回结果为整型值,否则返回浮点数(也是表示的是整数值),函数modf会返回取整的值外,还会返回小数部分作为第二个结果。

  1. floor向负无穷取整;
  2. ceil向正无穷取整;
  3. modf向零取整。
    表示范围
    Lua使用64位来存储整型数,则有范围。同样使用这64位来存储浮点数,其中11位为指数,剩余53位。所以浮点型能表示的整数范围限制在-2^53到2的53次方之间,超出这个范围的浮点数表示会损失精度。
    最大值2^63-1
    最小值-2^63
print(math.maxinteger)
print(math.mininteger)
--输出
9223372036854775807
-9223372036854775808

惯例
简单通过整型数加0.0将整型转换为浮点型。
通过与0进行按位或运算,可以把浮点数强制转换为整数值(此时会检查数值是否与整型值表示完全一致,即没有小数部分且其值在整型值的表示范围内,否则不满足条件抛出异常
同样可以使用math.tointeger浮点数强制转换为整数值,该函数会在无法转换时返回nil(此时会检查数值是否与整型值表示完全一致,即没有小数部分且其值在整型值的表示范围内,否则不满足条件返回nil

print(2^53)
print(2^53|0)
--输出
9.007199254741e+015
9007199254740992

猜你喜欢

转载自blog.csdn.net/qq_25327609/article/details/85699500