如果您处理精确值(尤其是金额、利率等),则必须避免浮点值/算术。浮点变量可以采用非常广泛的值范围,但它们并不精确。特别是在计算长期或非常不同的数量时,您会遇到麻烦。舍入误差会累积。这是由十进制数的宽值范围以固定长度的 32 位/64 位二进制值存储的方式引起的。例如,无辜的友好值0.1
作为二进制浮点值是相当困难的。有关详细信息,请参阅 IEEE 754 规范。
因此,在这些情况下,您必须使用数据类型进行精确计算。Java 提供BigDecimal类。避免浮点精度错误的另一种方法是仅使用整数进行计算,然后格式化输出以使其具有一定数量的小数位。
但是由于 Java 为定点数学 ( BigDecimal ) 提供了一个很好的即用型类,您可以尝试一下。看看这个小示例代码片段。您可以从几种不同的舍入模式中进行选择,并确定您想要的小数位数。
import java.math.BigDecimal;
import java.math.RoundingMode;
public class RoundTest {
public static void main(String[] args) {
String userInput = "42.133742";
BigDecimal startValue = new BigDecimal(userInput);
BigDecimal multFactor = new BigDecimal("1.23"); // => increase by 23 %
BigDecimal result = startValue.multiply(multFactor);
System.out.println("Original result without rounding: " + result);
System.out.println("Scale: " + result.scale());
// Compare different rounding modes:
final int DECIMAL_PLACES = 2;
BigDecimal roundDown = result.setScale(DECIMAL_PLACES, RoundingMode.DOWN);
BigDecimal roundHalfUp = result.setScale(DECIMAL_PLACES, RoundingMode.HALF_UP);
BigDecimal roundUp = result.setScale(DECIMAL_PLACES, RoundingMode.UP);
System.out.println("Round down (" + DECIMAL_PLACES + " decimal places): " + roundDown);
System.out.println("Round half-up (" + DECIMAL_PLACES + " dec. places): " + roundHalfUp);
System.out.println("Round up (" + DECIMAL_PLACES + " decimal places): " + roundUp);
}
}