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

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

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

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

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

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

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

难受。

 

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

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

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

 

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

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

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

 

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

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

3、Java8 的stream 和 limit

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

运行的结果是:

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

 

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

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

  • 允许他人重新传播作品,但他人重新传播时必须在所使用作品的正文开头的显著位置,注明用户的姓名、来源及其采用的知识共享协议,并与该作品在磨坊上的原发地址建立链接
  • 可对作品重新编排、修改、节选或者以作品为基础进行创作和发布
  • 可将作品进行商业性使用

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