6

浮点数的0不是0,怀疑人生了

 3 years ago
source link: https://gameinstitute.qq.com/community/detail/133540
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

浮点数的0不是0,怀疑人生了

发表于2020-09-21
评论0 1.8k浏览

想免费获取内部独家PPT资料库?观看行业大牛直播?点击加入腾讯游戏学院游戏程序行业精英群

711501594
9c663ef4792c8660cde4075c26fb2052.png

记录最近遇到的一些坑点,分享给常在河边走的你。

1、老师告诉我分母不能是0。

场景:项目有个功能是竞猜功能,竞猜需要的金币是根据公式:

M+ N*0.5/ diffDays。M是根据玩家等级策划配置的值,N是某一天到当前时间的收入总和,diffDays 是收入的天数。

在测试的时候,测试的同学发现在玩家有14亿的金币仍然不能竞猜,这很奇怪。经过调试发现diffDays 为0,为什么除0不报错呐?老师告诉我的不对吗?

c2c90657e96d84f37ca8abb97dff14c0.png

原因:double类型数据直接除0,0会向上转型为double,变为0.0,0.0在内存不是0,而是一个不精确的数,可能是0.000000000001或其它,所以一个正数除以0.0结果就得很大很大。所以返回了Long的最大值。

2、switch 为什么一定要加break?

场景:在写一个gm命令的时候将一个功能的gm全部定义进了一个协议内,通过case 进行区分操作,想当然的一位 { } 就是语句的结束,出现了多个case同时执行的情况。代码如下

0df436b8419596bbfbb120f7eb5bf0e3.png

探索一下为什么?想要知道为什么一切还要从源头说起:字节码

c351944167681378e0e71e44c7e0b19d.png

可以看到switch case 被编译成Lookupswitch ,两个case 被编译为L2,L3 ,并且自动添加了default L4。

接下来看下加入break 会做什么?

91a1649975eb4d428733f44cf2a483c7.png
3344340e71f3e023d4ab0dfdafa05e2b.png

加入break 之后,在L2 之后补上了L5,GOTO L4 ,L4 直接执行了18行,也就是程序的结束,不再执行下面的case。

除了Lookupswitch 还有 tableswitch ,具体的区别 你知道吗?下期再说哦。

3、Java8 的stream 和 limit

场景:最近有个功能是记录竞技场的前三名的玩家信息,但是只保留近5个赛季的,多余的则删除。写出了以下的代码:

569bc86ccefe8c9b3f7240c01e9b61b9.png

运行的结果是:

b4f4de33721c9f307b6c3a5b77bad8a7.png

妈耶:完全不是我设想的5个赛季,蛋疼。分析下原因:Java8 的写了不少了,但是有些函数还是有些想当然了。因为这个集合里有season 有多个数据,在最后进行limit 的时候取5个,最终只取到了8和9,怎么解决呐?解决重复数据当然用distinct。

c9f782c404cbf40f12782b98f6f72696.png

总结:搬砖不易,还是需要注意细节。你遇到过哪些坑,可以留言分享,记得点赞分享。关注我的公众号:香菜聊游戏

1.浮点数的0 不是0,2.switch不能忘记break,3.limit 是在所有数据中进行筛选。

434bdf59e48199a4aa3b683b2713d9c2.png

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK