0.999999999取整的问题

:joy:
请原谅我将它划分到creator的问题范围里。因为我不知道将它放到哪里比较好,而我又是在实现功能上遇到的问题。

我在实现一个功能,我用脚本控制了一个矩形地牢的生成,地牢由瓦片拼接而成,瓦片尺寸为64,地牢尺寸为99。在实现过程中,我通过角色的坐标,经过计算判断角色所在的瓦片的编号。
然后在 测试公式是否正确的过程中,我给定一个地图坐标P1,计算其编号坐标C1,再通过编号坐标C1计算其地图坐标P2,想通过地图坐标P2计算编号坐标C2,通过判断C1是否等于C2的过程中,发现,9
9=81个格子中,只有点(8,0)(8,5)(8,8)三个编号坐标的换算出现问题,它们的横坐标都变为7了。检测发现地图坐标转编号坐标的过程中,出现了:7.9999999999999被取整后为7的情况。
由于地牢从左下进行编号,所以在地图坐标转编号坐标的过程中,必须向下取整,所以取整方式没法进行改动。
所以请问下,我该怎么避免这种情况?

Math.round了解一下

地图坐标转编号坐标,坐标是左下开始编号,所以没法改动为Math.round…

  • 0.1 后在取整

就是说,如果是7.6,7.3,7.1,7.0等都是向下取整没问题的。就是计算的结果因为是7.99999999这个原本应该是8的数字因为误差(?)变成了7.99999,向下取整后就变成了7,所以就出错了…

加个判断,如果小数点数字小于0.9就向下取整,否则向上取整?

就是说7.8,7.9也是7对吧。那你单独判断一下如果大于0.9就想上取整不就行了

行吧,如果只有这样的方法的话…

目前采用的是前面两个大大的建议分段取整…
先挂着吧,看看有没有除了加分段取整的其他方法。没有的话我就结贴吧。

最好看一下原因 如果都是整数乘法 应该不会出现小数

不是整数乘法,因为是地图坐标经过计算后换算为编号坐标,地图坐标本身就是浮点数了,然后编号坐标是必须得整数的,所以在Math.floor的过程中,就出现了上诉所提及的问题了。
现在加了个分段取整的方式,问题算是已经解决了。
只是我想看看还有没有其他的解决方式,不然每次计算都得进行一次判断,而且判断方式也挺麻烦的,我是(原数字 - 向下取整后数字 > 0.999999)的判断语句,感觉有点繁琐。

js有精度丢失的问题 你可以把把需要运算的值放大一个倍数

例如 0.1 + 0.2 != 0.3 这个时候 结果为真 但是只要放大10倍 1 + 2 != 3 结果就为假了 然后除回来就好了

误差在±0.001的,直接Math.round()

试了下,可行,而且这种方式方便些。

跟前面的提到的那样,要进行一个判断。这里采用放大后取整再进行除法的方式,方便点。就不需要额外判断操作之类的。

主要是这样代码行数可以少好几行!