网站首页 > java教程 正文
数学绝对值是通过在两个管道符号之间放置值来表示的,计算方式如下:
|x| = x, |-x| = x
它通常用于计算/表示距离。例如,假设0代表海平面,我们有一个潜水员和一个登山者。潜水员在水下-45英尺(注意我们使用负数来表示潜水员在水下的深度)。同时,登山者攀登了30英尺高。他们中谁离海平面(0)更近?我们可能会认为-45 < 30,所以潜水员更近,因为它的值更小。但是,我们可以通过应用数学绝对值来轻松找到正确答案,如下所示:
|-45| = 45, |30| = 30
45 > 30,所以登山者离海平面(0)更近
现在,让我们通过以下示例深入探讨解决方案:
int x = -3;
int absofx = Math.abs(x); // 3
这是Math.abs()的一个非常简单的用例,它返回给定整数的数学绝对值。现在,让我们将这种方法应用于以下大数:
int x = Integer.MIN_VALUE; // -2,147,483,648
int absofx = Math.abs(x); // 这里会溢出,因为实际结果是-2,147,483,648(这是错误的)
这不好!因为|Integer.MIN_VALUE| > |Integer.MAX_VALUE|,所以int域溢出了。预期的结果是2,147,483,648的正数值,但这不适合int域。然而,将x的类型从int更改为long可以解决这个问题:
long x = Integer.MIN_VALUE; // -2,147,483,648
long absofx = Math.abs(x); // 2,147,483,648
但是,如果代替Integer.MIN_VALUE使用Long.MIN_VALUE,问题将再次出现:
long y = Long.MIN_VALUE; // -9,223,372,036,854,775,808
long absofy = Math.abs(y); // 这里会溢出,因为实际结果是-9,223,372,036,854,775,808(这是错误的)
从JDK 15开始,Math类增加了两个absExact()方法,一个用于int,一个用于long。如果数学绝对值结果倾向于溢出int或long域(例如,Integer/Long.MIN_VALUE值溢出正int/long范围),则这些方法非常有用。在这种情况下,这些方法会抛出ArithmeticException,而不是返回一个误导性的结果,如以下示例所示:
int absofxExact = Math.absExact(x); // ArithmeticException
long absofyExact = Math.absExact(y); // ArithmeticException
在函数式编程风格的上下文中,潜在的解决方案将依赖于UnaryOperator函数式接口,如下所示:
UnaryOperator<Integer> operatorInt = Math::absExact;
UnaryOperator<Long> operatorLong = Math::absExact;
// 两者都会抛出ArithmeticException
int absofxExactUo = operatorInt.apply(x);
long absofyExactUo = operatorLong.apply(y);
当处理大数字时,还请关注BigInteger(不可变的任意精度整数)和BigDecimal(不可变的任意精度有符号十进制数)。
- 上一篇: Java方法案例(二)(java方法题目)
- 下一篇: Java数据结构(JAVA数据结构与算法)
猜你喜欢
- 2024-10-24 Bigo的Java面试,我挂在了第三轮技术面上...
- 2024-10-24 纯干货|盘点Java常见的30个误区与细节
- 2024-10-24 JAVA中红黑树(javahashmap红黑树)
- 2024-10-24 一文让你理解java中的类加载器(java类加载器的作用)
- 2024-10-24 初识java—(三十五)Math类、Random类和BigDecimal类
- 2024-10-24 Java高级进阶-从计算机底层解析左移、右移、无符号右移
- 2024-10-24 终于有人把Git最火Java全套详细笔记(吐血放出)资料给分享出来了
- 2024-10-24 【算法题】1749. 任意子数组和的绝对值的最大值
- 2024-10-24 Java 的流程控制是什么样子的(java中的流程控制语句有哪些)
- 2024-10-24 Java常用内置函数(java内部类怎么调用)
你 发表评论:
欢迎- 最近发表
-
- 一招解决vscode报java插件版本不一致以及相关缓存引起的问题
- 关于Java 8版本的理解(java中的接口怎么理解)
- Java 9 到 Java 16 的版本演进:一次模块化革命和语言的持续进化
- 如何选择合适的Java版本(如何选择jdk版本)
- 晚会互动小游戏(晚会节目互动小游戏)
- 基于JavaSwing的象棋游戏系统java休闲游戏jsp源代码Mysql
- Java 猜字母游戏!会写会玩才是真本事!
- 基于JavaSwing的贪吃蛇大作战java休闲游戏jsp源代码mysql
- Java & Python 康威生命游戏 - 命令行版
- 高玩随机种子无损速通《我的世界》10分钟不到刷新世界纪录
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)