首页 > 编程知识 正文

如何负数变为正数,统计正数和负数的个数

时间:2023-05-05 21:43:50 阅读:24484 作者:1644

作者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的执行流程已经学废了!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。