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 类用于高精度的十进制运算。相比原生的 double
或 float
,它提供了更精确的控制能力,特别是在金融、科学计算等对精度要求极高的场景中。
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 仓库 中找到。