1. 引言

本文将带你快速实现一个命令行程序,用于在 Java 中计算百分比。

不过,我们先来回顾一下数学上如何计算百分比。

2. 数学公式

在数学中,百分比 是一个数或比率,表示为 100 的分数。通常使用百分号 “%” 表示。

假设一个学生获得了 x 分,总分为 y 分,那么该学生获得的百分比计算公式为:

percentage = (x / y) × 100

3. 简单的 Java 实现版本

明确了数学公式后,我们来用 Java 实现一个简单的百分比计算器:

public class PercentageCalculator {

    public double calculatePercentage(double obtained, double total) {
        return obtained * 100 / total;
    }

    public static void main(String[] args) {
        PercentageCalculator pc = new PercentageCalculator();
        Scanner in = new Scanner(System.in);
        System.out.println("Enter obtained marks:");
        double obtained = in.nextDouble();
        System.out.println("Enter total marks:");
        double total = in.nextDouble();
        System.out.println(
          "Percentage obtained: " + pc.calculatePercentage(obtained, total));
    }
}

这个程序从命令行读取学生获得的分数和总分,然后调用 calculatePercentage() 方法来计算百分比。

我们使用 double 类型来处理输入和输出,因为它可以支持最多 16 位小数精度,对于一般的使用场景来说已经足够了。

运行程序,输出如下:

Enter obtained marks:
87
Enter total marks:
100
Percentage obtained: 87.0

Process finished with exit code 0

✅ 简单粗暴,适合快速上手。

4. 使用 BigDecimal 的高精度版本

在 Java 中,BigDecimal 类用于高精度的十进制运算。相比原生的 doublefloat,它提供了更精确的控制能力,特别是在金融、科学计算等对精度要求极高的场景中。

4.1. 编写一个基于 BigDecimal 的工具类

我们先定义一个常量 ONE_HUNDRED,方便后续计算使用。然后实现两个核心方法:

public class BigDecimalPercentages {

    private static final BigDecimal ONE_HUNDRED = new BigDecimal("100");

    public BigDecimal toPercentageOf(BigDecimal value, BigDecimal total) {
        return value.divide(total, 4, RoundingMode.HALF_UP).multiply(ONE_HUNDRED);
    }

    public BigDecimal percentOf(BigDecimal percentage, BigDecimal total) {
        return percentage.multiply(total).divide(ONE_HUNDRED, 2, RoundingMode.HALF_UP);
    }
}
  • toPercentageOf():计算某个值占总数的百分比,保留 4 位小数。
  • percentOf():根据百分比和总数,计算出对应的值。

⚠️ 注意:divide() 方法必须指定精度和舍入模式,否则可能会抛出异常。

4.2. 使用 scaleByPowerOfTen() 优化性能

有些 BigDecimal 方法如 movePointLeft() 可以快速处理十的幂运算,但为了防止精度丢失,我们可以使用 scaleByPowerOfTen() 方法:

import java.math.BigDecimal;
import java.math.RoundingMode;

public class FastBigDecimalPercentage {

    public static BigDecimal toPercentageOf(BigDecimal value, BigDecimal total) {
        return value.divide(total, 4, RoundingMode.HALF_UP).scaleByPowerOfTen(2);
    }

    public static BigDecimal percentOf(BigDecimal percentage, BigDecimal total) {
        return percentage.multiply(total).scaleByPowerOfTen(-2);
    }

}

这种方式更加灵活,尤其适合处理极小数的情况。

4.3. 使用 Lombok 的 @ExtensionMethod 提升可读性

虽然上面的工具类功能完整,但调用方式略显啰嗦。我们可以通过 Lombok 的 @ExtensionMethod 来增强代码的流畅性:

import lombok.experimental.ExtensionMethod;
import java.math.BigDecimal;
import java.util.Scanner;

@ExtensionMethod(FastBigDecimalPercentage.class)
public class BigDecimalPercentageCalculator {
    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        System.out.println("Enter obtained marks:");
        BigDecimal obtained = new BigDecimal(in.nextDouble());
        System.out.println("Enter total marks:");
        BigDecimal total = new BigDecimal(in.nextDouble());

        System.out.println("Percentage obtained :"+ obtained.toPercentageOf(total));
    }

}

通过扩展方法,我们可以像调用 BigDecimal 自身的方法一样调用我们自定义的百分比计算方法,代码更优雅,可读性更强。

5. 总结

本文从数学公式出发,介绍了如何在 Java 中实现百分比计算。我们从简单的 double 版本,到使用 BigDecimal 实现高精度计算,再到使用 Lombok 提升代码可读性,层层递进。

📌 本文所有示例代码均可在 GitHub 仓库 中找到。


原始标题:Calculate Percentage in Java