网站首页 > java教程 正文
让我们从两个简单的计算开始,如下所示:
-4/-1 = 4, 4/-1 = -4
这是一个非常简单的用例,按预期工作。现在,让我们保持除数为-1,并将被除数更改为Integer.MIN_VALUE(-2,147,483,648):
int x = Integer.MIN_VALUE;
int quotient = x/-1; // 结果应该是 2,147,483,648,但这里的结果是 -2,147,483,648
这次结果不正确。因为|Integer.MIN_VALUE| > |Integer.MAX_VALUE|,所以int域溢出了。它应该是正数2,147,483,648,但这不适合int域。但是,将x的类型从int更改为long将解决问题:
long x = Integer.MIN_VALUE;
long quotient = x/-1; // 2,147,483,648
但是,如果Long.MIN_VALUE替代了Integer.MIN_VALUE,问题将再次出现:
long y = Long.MIN_VALUE; // -9,223,372,036,854,775,808
long quotient = y/-1; // 结果是 -9,223,372,036,854,775,808,这是错误的
从JDK 18开始,Math类增加了两个divideExact()方法。一个用于int,一个用于long。如果除法结果倾向于溢出int或long(如Integer/Long.MIN_VALUE溢出正int/long范围),则这些方法非常有用。在这种情况下,这些方法会抛出ArithmeticException,而不是返回一个误导性的结果,如下例所示:
// 抛出ArithmeticException
int quotientExact = Math.divideExact(x, -1);
在函数式编程风格的上下文中,潜在的解决方案将依赖于BinaryOperator函数式接口,如下所示:
// 抛出ArithmeticException
BinaryOperator<Integer> operator = Math::divideExact;
int quotientExactBo = operator.apply(x, -1);
正如我们在上一个问题中所说,当处理大数字时,还要关注BigInteger(不可变的任意精度整数)和BigDecimal(不可变的任意精度有符号十进制数)。
猜你喜欢
- 2024-10-11 Java的“异常”(JAVA的异常体系)
- 2024-10-11 第四讲《JAVA基础之运算符》,小妙招教你速记、速填坑
- 2024-10-11 容易让人忽视的,java高精度运算(java高精度转低精度的原则)
- 2024-10-11 提高千倍效率的 Java 代码小技巧(java提高班)
- 2024-10-11 一文搞明白java中的位运算、补码、反码、原码
- 2024-10-11 十五、Java运算符-赋值运算符与instanceof运算符
- 2024-10-11 一文掌握Java二、八、十六进制运算实现原理
- 2024-10-11 计算机进制转换(计算机进制转换教程)
- 2024-10-11 Java基础之try catch finally的原理
- 2024-10-11 LeetCode算法第29题:两数相除(计算两数相除并输出结果)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- 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)
本文暂时没有评论,来添加一个吧(●'◡'●)