1. 概述

本教程将演示如何在Java中计算两个数字的百分比差异。在深入代码实现前,我们先明确百分比差异的数学定义。这个计算在日常开发和数据分析中很常见,但实现时需要特别注意边界条件,避免踩坑。

2. 数学公式

计算两个数字百分比差异的数学公式如下:

百分比差异 = |(V1 – V2)/(V1 + V2)/2|×100

这个公式的核心逻辑是:

  1. 取两个值的绝对差值 |V1 - V2|
  2. 除以两个数的平均值 (V1 + V2)/2
  3. 最后乘以100转换为百分比

⚠️ 注意:当两个值都为0时,会导致除零错误,实际代码中需要处理这种边界情况。

3. Java实现

下面是一个简单粗暴的实现方法,直接套用数学公式:

static double calculatePercentageDifference(double v1, double v2) {
    double average = (v1 + v2) / 2;
    if (average == 0) {
        throw new IllegalArgumentException("V1和V2的平均值不能为零");
    }
    return Math.abs((v1 - v2) / average) * 100;
}

实现逻辑分解:

  1. 计算两个数的平均值
  2. 防御性检查:避免除零错误
  3. 计算绝对差值并转换为百分比
  4. 返回最终结果

✅ 优点:实现简洁,性能高效 ❌ 缺点:未处理浮点数精度问题(对大多数场景可接受)

3.1. 测试实现

有经验的程序员都知道,单元测试是验证算法正确性的关键。下面我们通过几个测试用例验证实现:

测试1:单值为0的情况

@Test
void whenOneValueIsZero_thenCalculateCorrectPercentageDifference() {
    double v1 = 0.0;
    double v2 = 50.0;
    double expected = 200.0;
    double result = PercentageDifferenceBetweenTwoNumbers.calculatePercentageDifference(v1, v2);
    assertEquals(expected, result, "当其中一个值为0时应正确计算百分比差异");
}

验证点:0和50的百分比差异应为200%(计算过程:|0-50|/((0+50)/2)×100 = 200)

测试2:常规数值计算

@Test
void whenCalculatePercentageDifferenceBetweenTwoNumbers_thenCorrectResult() {
    double v1 = 50.0;
    double v2 = 70.0;
    double expected = 33.33; // 手动计算:|50-70|/((50+70)/2)×100 ≈ 33.33
    double result = PercentageDifferenceBetweenTwoNumbers.calculatePercentageDifference(v1, v2);
    assertEquals(expected, result, 0.01, "常规数值应正确计算百分比差异");
}

验证点:50和70的百分比差异约为33.33%(允许0.01的浮点误差)

测试3:交换参数顺序

@Test
void whenV1AndV2AreSwapped_thenPercentageDifferenceIsSame() {
    double v1 = 70.0;
    double v2 = 50.0;
    double expected = PercentageDifferenceBetweenTwoNumbers.calculatePercentageDifference(v1, v2);
    double result = PercentageDifferenceBetweenTwoNumbers.calculatePercentageDifference(v2, v1);
    assertEquals(expected, result, 0.01, "交换V1和V2顺序结果应相同");
}

验证点:公式具有对称性,参数顺序不影响结果

4. 总结

本文展示了在Java中计算两个数字百分比差异的完整方案:

  • ✅ 实现了符合数学公式的核心算法
  • ✅ 处理了除零等边界条件
  • ✅ 通过单元测试验证了正确性
  • ✅ 验证了参数交换的对称性

实际开发中,如果需要更高精度,可以考虑使用BigDecimal替代double。完整实现代码可在GitHub仓库获取。


原始标题:Calculate Percentage Difference Between Two Numbers in Java | Baeldung