美文网首页Java 杂谈
Math.abs出现负数的问题

Math.abs出现负数的问题

作者: 朱端的一坨 | 来源:发表于2019-03-05 15:48 被阅读1次

背景

今天查看Sonar的时候发现静态检测出了一个bug,显示说绝对值可能为负。虽然触发的几率非常低,但是考虑到还是会存在隐患,而且一旦出问题之后可能很不容易定位,还是记录一下这个问题。具体代码如下:

int num = Math.abs(SecureRandom.getInstance("XXX").nextInt());

具体分析了一下之后,发现确实会存在当使用Integer.MIN_VALUE的时候,会造成这个问题,还是蛮有意思的,特此记录一下。


原因

我们先把结果运行一下,如下所示

System.out.println("Integer is " + Math.abs(Integer.MIN_VALUE));
System.out.println("Long is " + Math.abs(Long.MIN_VALUE));
System.out.println("Byte is " + Math.abs(Byte.MIN_VALUE));

Integer is -2147483648
Long is -9223372036854775808
Byte is 128

接着我们来看一下原因,还是在于对这个最小值的处理(或者说对负0的处理)。我们以前学过说,计算机实际处理符号数的时候,最高位是用来处理符号的,那么就可能产生一个正负零的问题,然后具体如何去处理这个就和具体的实现是有关系的(更多的还可以再回想一下反码补码之类的问题),那么在java中,具体计算过程如下图:


计算过程.png

后记

还是一个很有意思的小问题,又再一次回顾了一些很基础的知识点。同时可以也引申复习一下到浮点类型的正负零和精度问题。
顺便吐槽一下,Random里面设计的nextInt() 和 nextInt(int xxx)两个方法,感觉应该是大概是一样的,只是后面多了一个范围限定,但是实际上正负值这个差异还挺大的,感觉有点迷惑人。

可以进一步参考的资料:

相关文章

  • Math.abs出现负数的问题

    背景 今天查看Sonar的时候发现静态检测出了一个bug,显示说绝对值可能为负。虽然触发的几率非常低,但是考虑到还...

  • js 正负互转

    正数转成负数,这里直接用~ 负数转成正数,这里用绝对值Math.abs(),不用~,避免蜜汁问题 --by Aff...

  • Date.getTime()出现负数的问题

    用户选择了一个小于 1970-01-01年的时间,但 服务端 对该数据做 > 0的判断 ,导致报的这个错。 jav...

  • Bellmanford算法(负边权最短路径)

    弥补了Dijskla的缺陷: A->B的Dijskla算法在出现负数的时候出现判断错误。 问题的原因: 之所以出现...

  • Java中使用Math.abs你入坑了?

    一、前言 Math.abs函数是jdk中提供的一个用来返回入参绝对值的函数,也就是你输入一个负数,它会返回其对应绝...

  • 04-线程安全问题

    多线程操作共享的数据,例如买票问题,可能会出现相同的票,或者负数的票。出现这种问题的条件1. 多线程环境2. 多线...

  • 数值

    数值 // absolute 绝对值Math.abs(5);Math.abs(-5); // 5 // round...

  • 为什么负负得正?

    为什么? 负数的出现 历史上,人们开始正式使用负数的时间晚于使用0。在欧洲,到了17世界人们还在犹豫是否使用负数?...

  • LeetCode之Set Mismatch(Kotlin)

    问题: 方法:遍历数组一遍,通过占坑法记录出现过的数字,重复出现的位置设为负数,最后获取到重复的数字,然后可以根据...

  • 十六进制转成byte类型

    举例:7A &0xff的目的是保持二进制一致性,防止可能出现的正负数问题

网友评论

    本文标题:Math.abs出现负数的问题

    本文链接:https://www.haomeiwen.com/subject/alqouqtx.html