iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >为什么Java中负数的绝对值不一定是正数
  • 475
分享到

为什么Java中负数的绝对值不一定是正数

2023-06-20 17:06:19 475人浏览 独家记忆
摘要

这篇文章主要讲解了“为什么Java中负数的绝对值不一定是正数”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“为什么Java中负数的绝对值不一定是正数”吧!绝对值是指一个数在数轴上所对应点到原点

这篇文章主要讲解了“为什么Java中负数的绝对值不一定是正数”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“为什么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;

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

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

**这个极特殊情况下就是当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类型取绝对值其实也可能存在这个情况哦!只不过发生的概率就更低了,但是只要他存在,就有可能发生哦!

ps:下面看下Java 中怎么把负数转换为正数?

要将负数转换为正数(这称为绝对值),请使用Math.abs()。此Math.abs()方法的工作方式如下:“number = (number < 0 ? -number : number);”。
看一个完整的例子:

package com.mkyong;  public class app{     public static void main(String[] args) {         int total =1 +1 +1 +1 + (-1);         //output 3    System.out.println("Total : " + total);         int total2 =1 +1 +1 +1 + Math.abs(-1);         //output 5    System.out.println("Total 2 (absolute value) : " + total2);       }   }

输出量

Total :3
Total2 (absolute value) :5

在这种情况下,Math.abs(-1)会将负数1转换为正数1。  

感谢各位的阅读,以上就是“为什么Java中负数的绝对值不一定是正数”的内容了,经过本文的学习后,相信大家对为什么Java中负数的绝对值不一定是正数这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 为什么Java中负数的绝对值不一定是正数

本文链接: https://www.lsjlt.com/news/299027.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 为什么Java中负数的绝对值不一定是正数
    这篇文章主要讲解了“为什么Java中负数的绝对值不一定是正数”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“为什么Java中负数的绝对值不一定是正数”吧!绝对值是指一个数在数轴上所对应点到原点...
    99+
    2023-06-20
  • Java中负数的绝对值竟然不一定是正数
    绝对值是指一个数在数轴上所对应点到原点的距离,所以,在数学领域,正数的绝对值是这个数本身,负数的绝对值应该是他的相反数。 这几乎是每个人都知道的。 在Java中,想要获得有个数字的绝...
    99+
    2024-04-02
  • oracle绝对值函数的用法是什么
    在 Oracle 数据库中,绝对值函数的用法是使用 ABS 函数来返回一个数的绝对值。ABS 函数接受一个数值作为参数,并返回该数的...
    99+
    2024-04-09
    oracle
  • 为什么Go没有计算整数绝对值的函数?
    编程并不是一个机械性的工作,而是需要有思考,有创新的工作,语法是固定的,但解决问题的思路则是依靠人的思维,这就需要我们坚持学习和更新自己的知识。今天编程网就整理分享《为什么Go没有计算整数绝对值的函...
    99+
    2024-04-04
  • 怎么用Python求一个数的绝对值
    可以使用内置函数abs()来求一个数的绝对值。例如,求-5的绝对值可以这样写:pythonnum = -5abs_num = abs...
    99+
    2023-10-26
    python
  • python中怎么求函数的绝对值
    在python中使用abs函数求函数的绝对值,具体方法如下:abs:abs()函数的作用是返回数字的绝对值。abs()函数语法:abs( x )abs()函数使用方法:print "abs(-45) : ", abs(-45)print "...
    99+
    2024-04-02
  • mysql变为负数的函数是什么
    今天就跟大家聊聊有关mysql变为负数的函数是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。mysql变为负数的函数是什么1.abs()绝对值 ...
    99+
    2024-04-02
  • css中的绝对定位是什么意思
    本篇内容主要讲解“css中的绝对定位是什么意思”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“css中的绝对定位是什么意思”吧! 绝对...
    99+
    2024-04-02
  • CSS中相对定位和绝对定位的区别是什么
    CSS中相对定位和绝对定位的区别是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。CSS相对定位和绝对定位区别CSS相对定位CSS相对定位是...
    99+
    2024-04-02
  • 为什么采用绝对定位是UI设计中的明智选择
    为什么在UI设计中应用绝对定位是明智之选,需要具体代码示例 随着互联网技术的快速发展,用户界面设计(UI设计)在网页设计、应用程序开发等领域中扮演着重要的角色。在UI设计中选择合适的布局方式是至关重要的,而绝对定位作为一种常用的...
    99+
    2024-01-23
  • 为什么Java和Numpy是数据科学家的绝佳选择?
    数据科学是一个快速发展的领域,越来越多的人开始转向数据科学领域。在这个领域中,Java和Numpy是两个非常流行的选择。本文将探讨为什么Java和Numpy是数据科学家的绝佳选择,以及它们的优点和缺点。 Java和Numpy是两个非常不同的...
    99+
    2023-08-07
    numpy spring git
  • vue中为什么在组件内部data是一个函数而不是一个对象
    目录实例和组件中 data 的区别?组件中 data 定义对象和函数区别?如果采用函数的写法?总结扩展vue 组件data用箭头函数行不行?组件中 data 定义...
    99+
    2023-05-17
    vue中data为什么是函数而不是对象 vue中data是函数而不是对象
  • php中怎么利用abs()获取参数的绝对值
    这篇文章给大家分享的是有关php中怎么利用abs()获取参数的绝对值的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。php有什么特点1、执行速度快。2、具有很好的开放性和可扩展性。3、PHP支持多种主流与非主流的数...
    99+
    2023-06-15
  • PHP中怎么求n和指定数的绝对差
    今天就跟大家聊聊有关PHP中怎么求n和指定数的绝对差,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。<phpfunction test($n){  ...
    99+
    2023-06-20
  • c++中void函数不能赋值为什么
    c++kquote>在c++中,void函数不能赋值,原因如下:类型不匹配:void函数没有返回值,类型为void,与赋值运算符操作数类型不兼容。函数指针的本质:void函数没有返...
    99+
    2024-05-09
    c++
  • java中数组默认值是什么
    java中数组默认值是什么?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。java基本数据类型有哪些Java的基本数据类型分为:1、整数类型,用来表示整数的数据类型。2、浮点类型...
    99+
    2023-06-14
  • 怎么为Edm.DateTime的OData参数指定正确格式的值
    这篇文章主要讲解了“怎么为Edm.DateTime的OData参数指定正确格式的值”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么为Edm.DateTime的OData参数指定正确格式的值...
    99+
    2023-06-03
  • PHP中怎么判断一个数是不是指定数的倍数
    PHP中怎么判断一个数是不是指定数的倍数,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。PHP代码如:<phpfunction test($n){...
    99+
    2023-06-20
  • vue中定义的data为什么是函数
    目录一、new Vue场景二、组件场景总结高频面试题:vue中的data为啥是函数? 答案是:是不是一定是函数,得看场景。并且,也无需担心什么时候该将data写为函数还是对象,因为v...
    99+
    2024-04-02
  • Python和 c++/c/java对于负数的存储方式有什么不同
    本篇内容主要讲解“Python和 c++/c/java对于负数的存储方式有什么不同”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python和 c++/c/java对于负数的存储方式有什么不同”...
    99+
    2023-06-03
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作