dea_dy
2021-03-02T13:37:03+00:00
今天晚上研究Unity的时候,遇到一个问题,1除以0.2的余数,本来觉得很简单一个题,商为5,余数为0。
但是结果跟我们算的完全不一样,翻了半天官方文档没搞明白怎么回事,掏出计算机一算,余数是0.2?为什么商要取4,不取5?
因为浮点数吧,你看起来是0.2,实际上它可能是0.2000000001。
避免用浮点数求余吧
估计是把0.2转成2进制去除了,导致0.2比实际值稍微大了一点点,不过手里面找了几个编译器都不支持浮点数的求余
有的语言0.2+0.1都不等于0.3呢
你把0.2转成64位浮点数试试
[quote][pid=497160966,25748686,1]Reply[/pid] Post by [uid=43038930]史塔克233[/uid] (2021-03-02 21:51):
你能贴一下代码吗 说了半天我都没明白你干了啥[/quote][img]https://img.nga.178.com/attachments/mon_202103/02/-7Q16r-hsvuK14T3cSsg-gk.jpg.medium.jpg[/img]
其实是在研究shader graph,看着实例做了一下,前面都明白,取uv除以两个向量倒数的余数,但是我以为这样算出来是0,但是却显示得出的数乘以向量结果为1,也就是说余数不为0,就卡这里了,研究了一阵子才发现我把余数算错了。
[quote][pid=497159331,25748686,1]Reply[/pid] Post by [uid=42666049]dachr[/uid] (2021-03-02 21:42):
余数可能是0.19999999999999996[/quote]为什么不是0?
[quote][pid=497165316,25748686,1]Reply[/pid] Post by [uid=1543367]skydmusf[/uid] (2021-03-02 22:13):
为什么不是0?[/quote]简单说,因为0.2不是0.2,所以不是0。(误[s:ac:哭笑]
你可以看看IEEE浮点数表示法,0.2应该是0.20000000000000001,那余数自然是0.19999999999999996
你那边具体用的精度我也不确定,反正大概是这个意思(也可能是4楼那种精度)
[s:ac:汗]没看懂,取余的时候有小数不是会报错非法操作么(cpp的话)
[quote][pid=497169679,25748686,1]Reply[/pid] Post by [uid=60162893]一桶毒奶[/uid] (2021-03-02 22:36):
[s:ac:汗]没看懂,取余的时候有小数不是会报错非法操作么(cpp的话)[/quote]没那么复杂,我可能表述有问题,其实就是想问为什么不是0,而是0.2
[quote][pid=497169221,25748686,1]Reply[/pid] Post by [uid=42666049]dachr[/uid] (2021-03-02 22:34):
简单说,因为0.2不是0.2,所以不是0。(误[s:ac:哭笑]
你可以看看IEEE浮点数表示法,0.2应该是0.20000000000000001,那余数自然是0.19999999999999996
你那边具体用的精度我也不确定,反正大概是这个意思(也可能是4楼那种精度)[/quote]大概明白了[s:ac:哭笑]