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

2022-07-13 08:59:45

目录

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

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

3、Java8 的stream 和 limit


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

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 是在所有数据中进行筛选。

  • 作者:香菜聊游戏
  • 原文链接:https://gamwatcher.blog.csdn.net/article/details/108686065
    更新时间:2022-07-13 08:59:45