以下是问题代码:
此行:if curPerChangeNum >= maxPerChangeNum then 有错误,没有注意浮点数的问题
local function startIncrease(logonLayer, srcPro, targetPro, perCall, overCall)
local currentPro = srcPro
local frameChangeV = (targetPro - srcPro)/10
print("!!!srcPro, targetPro, frameChangeV --- ", srcPro, targetPro, frameChangeV)
local curPerChangeNum = 0
local maxPerChangeNum = 1
-- self:setProgressInfo(srcPro)
local m_increaseTimer = nil
m_increaseTimer = schedule(logonLayer,
function()
currentPro = currentPro + frameChangeV
curPerChangeNum = curPerChangeNum + frameChangeV
if curPerChangeNum >= maxPerChangeNum then
curPerChangeNum = math.max(0, curPerChangeNum - maxPerChangeNum)
print("!!! curPerChangeNum ", curPerChangeNum)
if perCall then
perCall(math.floor(currentPro))
end
end
if currentPro >= targetPro then
print("!!! currentPro ", currentPro)
if m_increaseTimer ~= nil then
logonLayer:stopAction(m_increaseTimer)
m_increaseTimer = nil
end
if overCall then
overCall()
end
else
-- self:setProgressInfo(currentPro)
end
end,
1
)
end
探讨以下例子:
local intA = 21
local floatA = 0.07*300
local isNumberEqual = tonumber(21) == tonumber(0.07*300) -- false
local isStringEqual = tostring(21) == tostring(0.07*300) -- true
local int_float = 21 - 0.07*300 -- -3.5527136788005e-15
local float_int = 0.07*300 - 21 -- 3.5527136788005e-15
local isIntBigger = int_float > 0 -- false
local isFloatBigger = float_int > 0 -- true
-- 21 21 false true -3.5527136788005e-15 3.5527136788005e-15 false true
print(intA, floatA, isNumberEqual, isStringEqual, int_float, float_int, isIntBigger, isFloatBigger)
可以看出:
看似相等的两个正数,float数比int数大一点
所以,不能直接用于相等判断。在使用大于或者小于判断时也要注意。
进一步探讨以下例子:
print(100*0.01 == 1) -- true
print(100*0.02 == 2) -- true
print(100*0.03 == 3) -- true
print(100*0.04 == 4) -- true
print(100*0.05 == 5) -- true
print(100*0.06 == 6) -- true
print(100*0.07 == 7) -- false
print(100*0.08 == 8) -- true
print(100*0.09 == 9) -- true
print(100*0.1 == 10) -- true
print(100*0.11 == 11) -- true
print(100*0.12 == 12) -- true
print(100*0.13 == 13) -- true
print(100*0.14 == 14) -- false
print(100*0.15 == 15) -- true
print(300*0.07 == 21) -- false
可以隐约总结出:
因为不确定性(但也有一定不确定性的规律,上边例子中7的倍数,结果就不准确)