【明日方舟】众所周知,肉斩骨断人人都会

我们来进行一个简单的计算。
突袭的提亚卡乌冠军强化后的攻击力为1100,其天赋效果为,在被阻挡时,将自身与对方的防御最终削减70%。
已知盾卫的防御为1000,削减70%之后剩下300,每次被打掉血800点,在被提亚卡乌冠军攻击25次之后会与对方同归于尽……才怪咧!
如图所示,盾卫的血量为0,但依旧存活,这又是怎么做到的呢?
0血存活这并不是什么新鲜事了,但此前的0血存活都是通过精准的控制与繁复的计算,利用干员的法抗让剩余血量为一个小于0.5的小数,继而被显示的舍入规则显示为0血。
但从盾卫这里看,提亚卡乌冠军的攻击力是物伤,似乎并不涉及小数方面的伤害,而这个削防效果似乎又不会产生任何小数,如果明日方舟没有一个血量小于0才判断干员强制退场的机制,那么肯定是某些地方的计算过程中引入了小数。
作为一个有基本计算机常识的人来说,第一眼看到觉得有问题的地方就是那个0.7。
有很多人可能会觉得,0.7不是很正常的一个有限小数吗?它乘以10之后就没有小数部分了啊,更何况是乘以1000之后呢?
但0.7在二进制下并不是有限小数。
如果有点计算机常识的人,估计已经知道我要说什么了。
但考虑到很多人对于进制这个东西的本质在课堂上并没有认真听,这里也简单复述一遍吧。
首先,我们常用的十进制,其基底为10,所有十进制数都可以写为10的不同整数次幂之和。
比如233就是2×10^2+3×10^1+3×10^0。
其他进制也一样,比如十进制下的7,在二进制下为111,也就是1×2^2+1×2^1+1×2^0。
小数方面也一样,
比如0.7就是7×10^-1,但这里来了一个问题——0.7并不能写成2的整数次幂之和,且每一项的系数均小于2。
因此0.7在二进制下是无限循环小数,写成二进制是0.101100110011001100……循环节从小数点后第二位开始,长度为4。
然而计算机并不能识别无限循环小数,也不可能分配无限的空间去存储一个数,这就涉及到储存数字的形式了(Windows自带的计算器其实里面的算法挺复杂的,并不是计算机课上学二叉树、堆栈时候用到的那么简单)
明日方舟储存数字使用的是64位定长小数,前32位保存整数部分,后三十二位保存小数。
0.7用这个形式储存下来的结果是:
0.10110011001100110011001100110011
我们将其再转换为十进制,看看结果:
0.6999999999534339....(后面的小数位就不写了)
结果很显而易见,这是一个小于0.7的数。
因此,如果将70%以0.7的形式保存起来,其实际结果是一个略小于0.7的数字。
那结论就很明显了,实际上每一次提亚卡乌冠军对盾卫造成的伤害只有799.99999……
这个取整足够小,以至于25次甚至2500次之后,都能够让理论上刚好归零的血量显示为0,但又足够明显,以至于系统不会做出该干员生命值已归零,需要强制退场的决定。
我也没想到我这次能在直播中打出这么具有戏剧性效果的结论,但综合来说这个的复刻并不算难,精二50级无潜落地三充能的艾雅法拉及时入场将三发点燃都打在冠军身上,剩下的让冠军和盾卫单挑,就能打出这样的效果了,或者你有其他的控血方案也可以?
想要减少这种情况很简单,将70%写成70/100先计算x70再计算÷100就行,不要写成0.7。