Java中两个long怎么相减?

在Java中,long类型相减直接使用减号(-)操作符即可,long result = a - b;,需注意数值范围(-2^63 ~ 2^63-1),若结果超出范围会静默环绕(溢出),不会抛出异常。

在Java中,long类型表示64位有符号整数(取值范围为 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807),其相减操作直接使用减法运算符 ,但需特别注意数值溢出问题,以下是详细说明:

Java中两个long怎么相减?


基础相减操作

直接使用 运算符即可完成相减:

long a = 20000L;
long b = 5000L;
long result = a - b;  // 结果: 15000

关键注意事项:溢出(Overflow)

当相减结果超出 long 的范围时,会发生静默溢出(无异常提示),导致结果错误:

long min = Long.MIN_VALUE; // -9,223,372,036,854,775,808
long max = Long.MAX_VALUE; // 9,223,372,036,854,775,807
// 错误示例 1:最小值减正数 → 结果变为正数(溢出)
long error1 = min - 1; // 结果: 9,223,372,036,854,775,807(错误)
// 错误示例 2:最大值减负数 → 结果变为负数(溢出)
long error2 = max - (-1); // 结果: -9,223,372,036,854,775,808(错误)

解决方案:避免溢出

使用 Math.subtractExact()(推荐)

Java 8+ 提供该方法,溢出时抛出 ArithmeticException

Java中两个long怎么相减?

try {
    long safeResult = Math.subtractExact(min, 1); // 抛出异常
} catch (ArithmeticException e) {
    System.out.println("溢出发生!");
}

手动检查边界

通过逻辑判断预防溢出:

long subtract(long a, long b) {
    if (b > 0 && a < Long.MIN_VALUE + b) {
        throw new ArithmeticException("下溢");
    }
    if (b < 0 && a > Long.MAX_VALUE + b) {
        throw new ArithmeticException("上溢");
    }
    return a - b;
}

使用 BigInteger(超大数场景)

超出 long 范围时,转为 BigInteger 处理:

import java.math.BigInteger;
BigInteger bigA = BigInteger.valueOf(min);
BigInteger bigB = BigInteger.valueOf(1);
BigInteger result = bigA.subtract(bigB); // 正确结果: -9,223,372,036,854,775,809

完整示例代码

public class LongSubtractionDemo {
    public static void main(String[] args) {
        // 基础相减
        long normalResult = 100000L - 30000L; // 70,000
        // 溢出处理
        try {
            long safeDiff = Math.subtractExact(Long.MIN_VALUE, 1);
        } catch (ArithmeticException e) {
            System.out.println("捕获溢出: " + e.getMessage());
        }
        // BigInteger 处理
        BigInteger bigResult = BigInteger.valueOf(Long.MIN_VALUE)
                                         .subtract(BigInteger.ONE);
        System.out.println("BigInteger 结果: " + bigResult);
    }
}

最佳实践总结

  1. 常规计算:直接使用 a - b
  2. 安全关键场景:优先用 Math.subtractExact()
  3. 超范围计算:迁移到 BigInteger
  4. 测试:对边界值(如 Long.MIN_VALUELong.MAX_VALUE)进行单元测试。

引用说明

Java中两个long怎么相减?

原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/26689.html

(0)
酷盾叔的头像酷盾叔
上一篇 2025年6月16日 14:55
下一篇 2025年6月11日 00:26

相关推荐

  • 如何同时启动两个Java程序

    要同时运行两个Java程序,可在命令行使用java命令分别启动它们(如java Program1 & java Program2在Unix),或用多线程在代码中创建多个线程执行不同任务。

    2025年6月1日
    300
  • Java如何设置组件高度和宽度?

    在Java中设置组件高度宽度可通过setSize(int width, int height)方法直接指定像素值,或使用setPreferredSize(new Dimension(width, height))配合布局管理器,Swing组件还支持setMinimumSize()/setMaximumSize()控制尺寸范围,JavaFX则用setPrefWidth()/setPrefHeight()方法实现弹性布局。

    2025年6月15日
    000
  • Java如何实现自动关机?

    在Java中实现自动关机,可通过Runtime.getRuntime().exec()执行系统关机命令,Windows使用shutdown -s -t 0立即关机,Linux/Mac用shutdown -h now,需注意程序需管理员/root权限,且强制关机可能导致数据丢失。

    2025年6月7日
    100
  • Java如何配置微信接口?

    配置微信接口需在微信公众平台设置服务器信息,包括URL、Token和消息加密密钥,后端编写接口处理微信验证请求(GET)及消息事件(POST),实现签名验证与消息加解密,确保与微信服务器通信安全可靠。

    2025年6月9日
    100
  • Java如何打开生成本地文件?

    在Java中生成本地文件后,可通过java.awt.Desktop类的open()方法直接调用系统关联程序打开文件,需先检查Desktop.isSupported()确保功能可用,再使用Desktop.getDesktop().open(file)执行打开操作。

    2025年6月6日
    100

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN