在我们进行小数取整运算时,可能会使用到round()
函数,通常是为了取一个最接近的整数,但是却容易出现如图的情况
实际用gm进行操作时,会出现“偏向双数的计算错误”,有的时候debug半天找不到问题,最后才发现问题原来在这里,用一句话总结就是:
(图文无关)
银行家舍入
实际上,round
使用的是一种银行家舍入算法,即【四舍六入五取偶】的舍入方法,其规则是:当舍去位的数值小于5时,直接舍去该位;当舍去位的数值大于5时,在舍去该位的同时向前位进一;当舍去位的数值等于5时,如果前位数值为奇,则在舍去该位的同时向前位进一,如果前位数值为偶,则直接舍去该位。
因此,gm中的round()
函数是符合规范的
精灵渲染问题
既然是四舍六入,那么问题就来了
调整了两个紧邻的obj的坐标后(一个向上移动了0.5像素,另一个向下移动了0.5像素)发现,两个obj的碰撞盒的底端和顶端各自增加了1像素,这就是因为round取整的结果
因此,有些时候一些喜欢追根究底的gm爱好者在研究gm的时候,经常会被round取整后的结果所迷惑,最典型的就是研究碰撞时,使用了小数,导致得到错误的研究结果。
虽然有时未对精灵进行旋转和缩放操作,但精灵本身却被插值模糊,就是因为绘制精灵的坐标可能是小数,导致round使整个精灵的长度增加了1像素,发生了失真。(典型例子:设计游戏时允许主角移动速度为小数,并且在移动完毕后未手动修正坐标取整,绘制出的图像失真)
因此,在需要四舍五入的情况下,最好自己写一个脚本,用来取整
【完】