天道不一定酬所有勤
但是,天道只酬勤

在Java中,负数的绝对值竟然不一定是正数!!!

GitHub 19k Star 的Java工程师成神之路,不来了解一下吗!

绝对值是指一个数在数轴上所对应点到原点的距离,所以,在数学领域,正数的绝对值是这个数本身,负数的绝对值应该是他的相反数。

这几乎是每个人都知道的。

在Java中,想要获得有个数字的绝对值,可以使用java.lang.Math中的abs方法,这个类共有4个重载的abs方法,分别是:

public static int abs(int a) {
    return (a < 0) ? -a : a;
}

public static long abs(long a) {
    return (a < 0) ? -a : a;
}

public static float abs(float a) {
    return (a <= 0.0F) ? 0.0F - a : a;
}

public static double abs(double a) {
    return (a <= 0.0D) ? 0.0D - a : a;
}

以上4个方法分别返回int、long、float、double类型的绝对值,方法里面的逻辑也简单,无非就是整数直接返回,负数取相反数返回

所以,基于以上所有的知识,我们经常会直接使用Math.abs来对一个数字取绝对值。

在我们的代码中,也有很多这样的例子。

比如,我们需要用订单号做分库分表,但是订单号是字符串类型,所以,我们就需要取得这个字符换的hashCode,因为hashCode可能是负数,所以然后再对hashCode取绝对值,再用这个值去对分表数取模:

Math.abs(orderId.hashCode()) % 1024;

但是,上面这个逻辑是有问题的!!!

因为在极特殊情况下,上面的代码会得到一个负数的值。

Hollis此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“验证码”,获取验证码。在微信里搜索“Hollis”或者“hollischuang”或者微信扫描右侧二维码都可以关注本站微信公众号。

(全文完)

扫描二维码,关注作者微信公众号
赞(3)
如未加特殊说明,此网站文章均为原创,转载必须注明出处。HollisChuang's Blog » 在Java中,负数的绝对值竟然不一定是正数!!!
分享到: 更多 (0)

评论 1

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    额,但是如果数据类型本来就是Long型,比如
    Long min = Long.MIN_VALUE;
    Sysout(Math.abs(min));
    这样也会是负数啊。如果要解决Long型的负数是否要考虑更大精度的类型,如果更大精度的类型的绝对值依然是负数又改怎么办,有没有万无一失的方法?
    或者说把数值类型转换成String,然后判断第一位是否为”-“?

    基伦3个月前 (07-23)回复

HollisChuang's Blog

联系我关于我