在lua-5.3.0中,结果是正确的,在lua-5.2.0中,是这么定义的:
449 /*
450 @@ LUA_UNSIGNED is the integral type used by lua_pushunsigned/lua_tounsigned.
451 ** It must have at least 32 bits.
452 */
453 #define LUA_UNSIGNED unsigned LUA_INT32
所有超过int32范围的数,在lua-5.2.0中,应该都是以double计算的。
PS: 感觉5.3.0之前的lua,就是小孩子的玩具~
在 2015-08-23 19:53:41,"Yichun Zhang (agentzh)" <age...@gmail.com> 写道:
>Hello!
>
>2015-08-22 18:49 GMT+08:00 姚尉:
>> 最近用lua处理某些大整数的时候发现不对劲
>>
>> 下面这条语句的结果是:10992432728506384
>> print(string.format("%d", 186312419127226*59 + 49))
>> 但是这个算术得到的结果应该是:10992432728506383
>>
>> 有人碰到过同样的问题吗?
>> 不知道是因为string.format的问题呢,还是说lua本身计算的时候精度导致的,这个结果没有超过long型啊
>>
>
>在 LuaJIT 中,Lua number 的默认精度上限是双精度浮点数(double)。如果你想进行无精度损失的 64 位整数计算,须使用
>FFI cdata 的包装整数类型。例如,对于你这里的例子:
>
> local ffi = require "ffi"
> local res = ffi.new("int64_t", 186312419127226)*59 + 49)
> print(tostring(res)
>
>使用 LuaJIT 运行这三行 Lua 代码得到的结果是
>
> 10992432728506383LL
>
>正是你期望的值。
>
>Regards,
>-agentzh
>
>--
>