Lua小坑之整数
在最近的一次开发中,需要将两个整数做除法,例如以下简单语句:
c=a/b
由于a和b都是整数,因此我又想当然地认为c也是整数,而实际上Lua将c转换成浮点数,导致后续逻辑判断和处理都出错了。这又是Lua让人意外的一个地方,我很困惑设计者为什么要这么设计。在Lua 5.3的reference manual文档中,对此有明确说明:
Exponentiation and float division always convert integer operands to floats.
据说5.3版本之前,Lua甚至都不支持整数,只有浮点数。而我们的程序通常只有两种类型:整数和字符串,因此重新将计算结果转换回整数是个急需解决的问题。在翻看manual文档时,看到math.tointeger接口,试了一下,结果极为悲催,返回了nil值!这是搞个毛线啊?
幸运地是lua对C很友好,因此只好手工打造一个接口给Lua程序用:
static int bluaToInt(lua_State *L) { assert(NULLP!=L); int intVal = 0; int type = lua_type(L,1); switch( type ) { case LUA_TNUMFLT: intVal = (int)luaL_checknumber(L,1); break; case LUA_TNUMINT: intVal=(int)luaL_checkinteger(L, 1); break; case LUA_TSTRING: intVal = BclStrToInt(luaL_checkstring(L,1)); break; default: assert(0); break; } lua_pushinteger(L, intVal); return 1; }
将上述函数注册到Lua中,定义为“ToInt”,然后在脚本中使用即可。由此上述示例代码变为:
c=ToInt(a/b)
这样就能确保c为整数类型。