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

作者 l Hollis

来源 l Hollis(ID:hollischuang)

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

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

在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;

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

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

这个极特殊情况下就是当hashCode是Integer.MIN_VALUE,即整数能表达的最小值的时候,可以代码验证下:

  public static void main(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()) % 1024; 

就万无一失了。

大家可以执行下以下代码:

public static void main(String[] args) {System.out.println(Math.abs((long)Integer.MIN_VALUE));}

得到的结果就是:

 2147483648

以上,就是今天要介绍的知识点了。

但是,一定要记得,对long类型取绝对值其实也可能存在这个情况哦!只不过发生的概率就更低了,但是只要他存在,就有可能发生哦!


往期推荐

绝,Java 中创建对象的 5 种方法!


SpringBoot 优雅的参数效验!


MyBatis 的执行流程,学废了!



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/544649.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言交换两个数字 位运算_交换两个8位数字| 8086微处理器

c语言交换两个数字 位运算Problem statement: 问题陈述&#xff1a; To swap two 8 bits numbers using third register on 8086 microprocessor. 使用8086微处理器上的第三个寄存器交换两个8位数字。 Algorithm: 算法&#xff1a; Load first number in register AL throug…

自己写着玩(二)

转载于:https://www.cnblogs.com/wangmengmeng/p/4572611.html

C#阻止计算机关闭显示器和待机

一、测试 测试环境&#xff1a;Win10 备注&#xff1a; 1、管理员和非管理员权限测试都正常&#xff1b; 2、执行阻止关闭显示器和待机后&#xff0c;退出程序会自动恢复&#xff1b; 3、使用WinL切换到锁屏界面时&#xff0c;同样生效&#xff1b; 二、代码 代码来源&a…

实战:隐藏SpringBoot中的私密数据!

这几天公司在排查内部数据账号泄漏&#xff0c;原因是发现某些实习生小可爱居然连带着账号、密码将源码私传到GitHub上&#xff0c;导致核心数据外漏&#xff0c;孩子还是没挨过社会毒打&#xff0c;这种事的后果可大可小。说起这个我是比较有感触的&#xff0c;之前我TM被删库…

Java中从String到Long的转换

Given a string and we have to convert it into a long. 给定一个字符串&#xff0c;我们必须将其转换为long。 Java conversion from String to Long Java从String转换为Long To convert a String to Long, we can use the following methods of Long class (see the synta…

pyotherside 试用

pyotherside 试用这是啥&#xff1f;用python写qt步骤&#xff1a;安装qt&#xff1a; http://www.qt.io/download-open-source/#section-2安装python3:下载源代码 https://github.com/thp/pyotherside编译 pyotherside&#xff1a; 他主页上有一个简短的说明 qmake m…

JS的条形码和二维码生成

一、前言 最近做项目用到了JS生成条形码和二维码&#xff0c;内容不多&#xff0c;整理一下方便使用。 2018年7月5日更新&#xff1a; 二维码生成时&#xff0c;如果长度太长会有异常&#xff1a; Uncaught Error: code length overflow. (1604>1056) 创建的时候&#…

synchronized 中的 4 个优化,你知道几个?

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;synchronized 在 JDK 1.5 时性能是比较低的&#xff0c;然而在后续的版本中经过各种优化迭代&#xff0c;它的性能也得到了前…

31Exchange Server 2010跨站点部署-搬迁Exchange服务器到分支机构

16.4 将EX07和EX08搬迁到上海分支机构首先我在上海分支机机构站点下创建一个CAS阵列&#xff0c;命令如下&#xff1a;下面获取下当前域中的CAS阵列信息16.4.1搬迁CAS,HT服务器1、从广州总部NLB群集删除EX07主机2、修改EX07的IP地址为分支机构IP地址 192.168.20.27(上海分支机构…

php框架laravel_Laravel简介(PHP框架)

php框架laravel介绍 (Introduction) Laravel is a powerful framework of PHP which is used to develop a web application. Laravel is created by Taylor Otwell. This is simple, elegant, robust and easy to understand to create a fully-featured web application. If …

@Autowired的这些骚操作,你都知道吗?

前言最近review别人代码的时候&#xff0c;看到了一些Autowired不一样的用法&#xff0c;觉得有些意思&#xff0c;特定花时间研究了一下&#xff0c;收获了不少东西&#xff0c;现在分享给大家。也许Autowired比你想象中更强大。1. Autowired的默认装配我们都知道在spring中Au…

C# Winform 使用二维码

关于C# Winform 程序中使用二维码的使用记录&#xff1a; 1、使用 Nuget 安装 ZXing.Net 程序包&#xff1b; 2、调用代码&#xff1a; private void button1_Click(object sender, EventArgs e) {BarcodeWriter writer new BarcodeWriter();writer.Format BarcodeFormat…

[Swust OJ 85]--单向公路(BFS)

题目链接:http://acm.swust.edu.cn/problem/0085/ Time limit(ms): 5000      Memory limit(kb): 65535Description某个地区有许多城镇&#xff0c;但并不是每个城镇都跟其他城镇有公路连接&#xff0c;且有公路的并不都能双向行驶。现在我们把这些城镇间的公路分布及允许…

7 种分布式全局 ID 生成策略,你更爱哪种?

上了微服务之后&#xff0c;很多原本很简单的问题现在都变复杂了&#xff0c;例如全局 ID 这事&#xff01;最近工作中刚好用到这块内容&#xff0c;于是调研了市面上几种常见的全局 ID 生成策略&#xff0c;稍微做了一下对比&#xff0c;供小伙伴们参考。当数据库分库分表之后…

C# 读取照片的EXIF信息

一、使用 MetadataExtractor 读取 EXIF 信息 1、NuGet 中安装 在 NuGet 中搜索并安装 MetadataExtractor&#xff1b; 2、包信息 我安装后会有两个包&#xff1a;MetadataExtractor 2.0.0 和 XmpCore 5.1.3 3、代码实现 我是创建的 WPF 项目&#xff1a; private void B…

c#equals方法源码_C#中的Int32.Equals()方法示例

c#equals方法源码Int32.Equals()方法 (Int32.Equals() Method) This method is used to compare two integer objects and returns boolean values either true or false. 此方法用于比较两个整数对象&#xff0c;并返回布尔值true或false。 Syntax: 句法&#xff1a; bool i…

ReentrantLock 中的 4 个坑!

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;JDK 1.5 之前 synchronized 的性能是比较低的&#xff0c;但在 JDK 1.5 中&#xff0c;官方推出一个重量级功能 Lock&#x…

Android中如何查看内存(上)

文章参照自&#xff1a;http://stackoverflow.com/questions/2298208/how-to-discover-memory-usage-of-my-application-in-android#2299813像Linux这种现代操作系统的内存使用是很复杂的&#xff0c;因此很难准确的知道你的应用程序使用了好多内存。查看内存使用的方式有很多种…

.NET 4.0 调用 C dll 触发 AccessViolationException 异常的处理方案

一、问题 最近做项目的时候&#xff0c;在调用 c 写的 dll 的时候&#xff0c;遇到一个程序异常&#xff0c;发现捕捉不到&#xff0c;异常为&#xff1a;System.AccessViolationException 二、解决方案 详细内容和原理可以看下面引用的内容&#xff0c;我这里使用的方法是在…

ai逻辑回归_人工智能中的逻辑是什么?

ai逻辑回归人工智能逻辑 (Logic in Artificial Intelligence) Logic, as per the definition of the Oxford dictionary, is "the reasoning conducted or assessed according to strict principles and validity". In Artificial Intelligence also, it carries som…