今天在做项目时有个需要将编号转换成二维数组序号的需求,代码如下:
function UIMineClearance:CalculatePosByIndex(rIndex) -- 输入一个编号 返回一个10 * 10 数组的下标
local lX , lY = math.modf(rIndex / 10)
lY = math.floor(lY * 10)
return lX + 1,math.ceil(lY) + 1
end
然后我发现有些结果往往和预期不同,我疯狂的打印每一步的变量(脚本语言不能进行调试是真的难受),最终让我揪出个大问题,math.modf() 函数有误差。为了证实我的想法,我单独打印了一下测试的值。
local a,b = math.modf(12/10)
print(a,b)
print(math.floor(b * 10))
math.modf(x)方法是返回两个值,第一个值是浮点类型x的整数部分,第二个值是浮点类型x的小数部分。
打印如下:
看到没有,最坑的来了,经过math.floor()的向下取整后 发现竟然变成了1,说明modf方法 在返回第二个值的时候是有误差的 应该是 0.1999999999 所以最终我将小数处理前乘上100在进行运算 尽量规避误差。最终代码:
function UIMineClearance:CalculatePosByIndex(rIndex)
local lX , lY = math.modf(rIndex / 10)
lY = math.modf(lY * 100)/10
return lX + 1,math.ceil(lY) + 1
end
希望其他的小伙伴遇到能够尽早知道这个坑。
我还是只菜鸟,如果文中有说的不对的地方,欢迎各位多多指点。