作者l Hollis
源Lhollis(id:HollisChuang ) ) )。
绝对值是指某个数在轴上从对应点到原点的距离。 因此,在数学领域,正数的绝对值应该是它本身,负数的绝对值应该是他的相反数。
这几乎人人都知道。
在Java中,要获得数字的绝对值,请使用java.lang.Math中的abs方法。 此类具有四个重载的abs方法:
公共安全(inta ) (return ) a0 )? -a:a; }publicstaticlongabs(Longa ) return (A0 )? -a:a; }公共安全浮动(浮动)返回(a=0.0f )? 0.0F-a:a; } publicstaticdoubleabs (双精度) return (a=0.0d )? 0.0D-a:a; }上述四种方法分别返回int、long、float、double类型的绝对值,方法中的逻辑也很简单,无非就是整数直接返回,负数取相反数返回
所以,基于以上所有知识,我们经常直接使用Math.abs对一个数字取绝对值。
我们的代码中也有很多这样的例子。
例如,必须按订单编号创建分类表。 但是,订单编号是字符串类型,所以必须获取此字符转换后的hashCode。hashCode可能是负数,所以取hashCode的绝对值,用该值对分类表的数量进行建模。
math.ABS(Orderid.hashcode ) ) 24; 但是,上面这个逻辑是有问题的!!!
因为在非常特殊的情况下,上面的代码会得到负值。
在hashCode是Integer.MIN_VALUE (即可以用整数表示的最小值)时,可以执行代码验证。
publicstaticvoidmain (string [ ] args ) system.out.println ) math.ABS(integer.min_value ); }执行上述代码可以获得以下结果:
-2147483648很明显,这是负数!
为什么会这样呢?
从Integer的可能范围来说明,int的可能范围为-2^31——(2^31 )- 1,即-2147483648到2147483647
那么,使用abs取绝对值时,如果要取-2147483648的绝对值,它应该是2147483648。
然而,2147483648大于2147483647,即超出了int可能的值的范围。 这时会发生越境。
2147483647表示为二进制补数,如下所示。
01111111 11111111 11111111 11111111
该公式1如下
10000000 00000000 00000000 00000000
这个二进制是-2147483648的补数。
但是,这种情况发生的概率是只有当要取绝对值的数字是-2147483648的时候,得到的数字还是个负数。
那么,如何解决这个问题呢?
如果你觉得越境最终结果会是负面的,可以解决越界的问题。 取绝对值前,将该int类型转换为long类型。 那样的话,就不会发生越境了。
例如,前面我们的分表逻辑被修改为
math.ABS () long ) orderId.hashCode ) ) 24; 万全。
可以执行以下代码:
publicstaticvoidmain (string [ ] args ) system.out.println ) math.ABS () Integer.MIN_VALUE ); 结果如下
2147483648以上是今天介绍的知识点。
但是,请记住。 long型取绝对值其实也有可能是这种情况哦。 只是,发生的概率会更低,但只要他在,就有可能发生哦!
过去的推荐
绝对,用Java创建对象的五种方法!
SpringBoot优雅的参数效果!
MyBatis的执行流程已经学废了!