Lua—算术运算中的自动类型转换

3,581 阅读2分钟

1.String To Number

  • 针对字符串的所有算数操作会尝试将字符串转换为数值。 
  • lua5.3没有实现强制类型转换与整型的集成,而是采用了另一种更简单和快速的实现方式: 算术运算的规则就是只有在两个操作数都是整型时结果才是整型,因此,由于字符串不是整型值,所以任何参与算术运算的字符串都会被当作浮点运算处理。 
  • 可以使用函数tonumber显示地将一个字符串转换成数值。默认情况下,tonumber函数使用的是十进制,但是也可以对第一个参数指明使用任意进制: 

例如: tonumber(“100101”,2) --> 37

2.Number To Number

  • 调用函数tostring可以将数值转换为字符串  

print(tostring(10) == "10") --> true

  • 这种转换总是有效的,但是这种转换并不能控制输出字符串的格式(例如,结果中十进制数字的个数) 

3.int To float

  • 可以通过增加0.0的方法整型值转换为浮点型

print(-3 + 0.0)   --> -3.0

  • 缺点:对于绝对值超过2^53(9007199254740992)的整型值而言可能导致精度损失 

    print(9007199254740991 + 0.0 == 9007199254740991) -> true print(900719925740993 + 0.0 == 900719925470993) --> false

4.float To int

  • 可以通过与零进行按位或运算,可以把浮点型值强制转换为整型值:

    2^53 --> 9.007199254741e+15(浮点型) 2^53 | 0 --> 9007199254740992 (整型值)

  • 缺点:将浮点型值强制转为为整型值时,lua语言会检查数值是否与整型值表示完全一致。条件:即没有小数部分且值在整型值的表示范围内。不满足条件会抛出异常 

    3.2 | 0 --小数部分 stdin:1: number has no integer reoresentation
    2^64 | 0 --超出范围

  • 可以通过使用函数math.tointeger将数值强制转换为整型值。