Lua float和int类型总结

一、float和int类型的区分

从lua5.3以后,lua中的number类型有了两个子类型,float和int,但是他们的类型都是number;Lua对两种类型有显式使用的规则,但是lua也会提供自动转换,对开发者是透明的,因此,大多数时候我们并不需要关注float和int之间的区别;

标准的Lua是使用64-bit的int以及64-bit的双精度float,但是也支持使用32-float的int以及32-byte单精度float;math库定义了最大整数(math.maxinteger)和最小整数(math.mininteger);

使用type函数,得到float和int的类型都是number;如果要区分float和int,则需要使用math.type();

为什么新增int

这个问题知乎上有部分回答,大概浏览了一下,5.3以前的number使用double存储,但是int的一些功能如位运算、索引用途等是double做不到的,所以增加int子类型是必然的;

而且double和int所占的字节数不同,区分开来也是lua编译器层面做的一种优化;

二、Lua中类型的自动转换

无论是Lua5.3以前还是Lua5.3,lua都为我们做了一些自动类型转换;但是随着5.3的升级改动,自动转换的规则也出现了差异;

1.lua5.3以前中的一些规则

数字转字符串:自动转换,不会失败,如在字符串拼接,字符串格式化输出时;

字符串转数字:可以转换为int或float,根据环境而定;可能会失败;

int转float:不会失败,出现在各种与float的双目运算中;

float转int:可能会失败,如果float不在整数表示的范围内;

2.lua5.3中变更的一些规则

lua5.3以后,要求开发者更加显式地区分float和int,如string.format(“%d”, 1.2)会出现报错,而不是float-int自动转换为1;

在string.format中,整数可以自动转为浮点数,但是浮点数不能自动转为整数,会有报错。

三、float转为int

1.math.floor()、math.ceil(),取整函数;

lua中的浮点数实际是使用double类型存储,会出现一点问题

参考:Lua floor运算的误差问题

2.//运算符

整数除法,如果两个操作数都是int,使用//运算符将得到整数结果,否则为float;

注意:不是只有整数的运算得到的结果一定是整数,幂运算得到的结果一定是浮点数,目的是为了统一正负幂运算;

    原文作者:莫之
    原文地址: https://blog.csdn.net/qq_36383623/article/details/104603983
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞