为什么LUA5.1错误地解释某些整数?

为什么LUA5.1错误地解释某些整数?,lua,integer,Lua,Integer,Lua5.1将许多完全有效的64b整数解释为 1,805,996,217,335,808,768 而最大的有符号有效64b整数为 9,223,372,036,854,775,807 下面是一个不幸输出的示例: Lua 5.1.5 Copyright (C) 1994-2012 Lua.org, PUC-Rio > return 1805996217335808768 == 1805996217335808804 true > return 180599621733580876

Lua5.1将许多完全有效的64b整数解释为

1,805,996,217,335,808,768 
而最大的有符号有效64b整数为

9,223,372,036,854,775,807
下面是一个不幸输出的示例:

Lua 5.1.5  Copyright (C) 1994-2012 Lua.org, PUC-Rio
> return 1805996217335808768 == 1805996217335808804
true
> return 1805996217335808768 == 1805996217335808805
true
> return 1805996217335808768 == 1805996217335808806
true
> return 1805996217335808768 == 1805996217335808769
true
> return 1805996217335808768 == 1805996217335808767
true
人们希望看到
false
到处都是
true

编辑(标记为重复):


这不是的副本,因为您无法编译Lua 5.1来处理64b整数。

Lua 5.1使用精度为53位的双精度类型

只有数字的前53位将存储在双分数部分。 最大有效整数为9007199254740991。若数字大于9007199254740991,则53位之前的最后一位将归零

54位数字:

18014398509481983 = 111111111111111111111111111111111111111111111111111111b
内部将存储为

18014398509481982 = 111111111111111111111111111111111111111111111111111110b

因为只使用前53位,所以两者相等。

Lua在5.3之前没有整数。它们是64位浮点,与JavaScript类似,只能表示2^53以下的整数−1明确无误。经典的“这不是一个bug,它是一个特性”。谢谢你的回复!可能是重复的,这不是一个“特征”。这就是为什么他们在5.3中修复了它