活动公告

系统通知
05-18 21:22
系统通知
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,资源失效请在帖子内回复要求补档,会尽快处理!
10-23 09:31

深入理解Java float相加问题 从浮点数表示原理到精度损失分析再到BigDecimal解决方案 助你轻松应对浮点数运算挑战

SunJu_FaceMall

3万

主题

2860

科技点

3万

积分

白金月票

碾压王

积分
32872

塔罗立华奏

<font color=白金月票" /> 发表于 2025-9-8 10:40:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、Java float相加问题概述

在Java编程中,许多开发者都曾遇到过float类型相加时的精度损失问题。让我们先看一个简单的例子:
  1. public class FloatAdditionExample {
  2.     public static void main(String[] args) {
  3.         float a = 0.1f;
  4.         float b = 0.2f;
  5.         float result = a + b;
  6.         
  7.         System.out.println("0.1 + 0.2 = " + result); // 输出:0.1 + 0.2 = 0.3
  8.         System.out.println("结果是否等于0.3? " + (result == 0.3f)); // 输出:结果是否等于0.3? false
  9.         
  10.         // 更明显的例子
  11.         float c = 1.0f;
  12.         float d = 0.9f;
  13.         float e = 0.1f;
  14.         System.out.println("1.0 - (0.9 + 0.1) = " + (c - (d + e))); // 输出:1.0 - (0.9 + 0.1) = -2.3841858E-8
  15.     }
  16. }
复制代码

从上面的例子可以看出,简单的浮点数相加也会导致精度问题。更令人惊讶的是,0.1 + 0.2的结果竟然不等于0.3!这种现象在金融计算、科学计算等需要高精度的场景中是不可接受的。

二、浮点数在计算机中的表示原理

要理解为什么浮点数相加会出现精度问题,我们需要了解浮点数在计算机中的表示方式。Java中的float类型遵循IEEE 754标准,使用32位二进制来表示一个浮点数。

2.1 IEEE 754浮点数标准

IEEE 754标准将32位的float分为三个部分:

1. 符号位(Sign):1位,0表示正数,1表示负数
2. 指数位(Exponent):8位,用于表示指数范围(偏移量为127)
3. 尾数位(Mantissa):23位,用于表示有效数字

具体结构如下:
  1. | 符号位 (1位) | 指数位 (8位) | 尾数位 (23位) |
复制代码

2.2 浮点数的实际表示

浮点数的实际值可以通过以下公式计算:
  1. 值 = (-1)^符号位 × (1 + 尾数) × 2^(指数位 - 127)
复制代码

让我们以0.1为例,看看它在计算机中是如何表示的:
  1. public class FloatRepresentation {
  2.     public static void main(String[] args) {
  3.         float number = 0.1f;
  4.         
  5.         // 获取float的位表示
  6.         int bits = Float.floatToIntBits(number);
  7.         
  8.         // 解析各个部分
  9.         int sign = (bits >> 31) & 0x1;
  10.         int exponent = (bits >> 23) & 0xFF;
  11.         int mantissa = bits & 0x7FFFFF;
  12.         
  13.         System.out.println("0.1的32位表示: " + Integer.toBinaryString(bits));
  14.         System.out.println("符号位: " + sign);
  15.         System.out.println("指数位: " + exponent);
  16.         System.out.println("尾数位: " + Integer.toBinaryString(mantissa));
  17.         
  18.         // 计算实际值
  19.         double value = Math.pow(-1, sign) * (1 + mantissa / Math.pow(2, 23)) * Math.pow(2, exponent - 127);
  20.         System.out.println("计算得到的值: " + value);
  21.     }
  22. }
复制代码

运行上述代码,我们会发现0.1在计算机中实际上是一个无限循环的二进制小数,无法精确表示。计算机只能存储一个近似值,这就是精度问题的根源。

2.3 为什么十进制小数不能精确表示为二进制浮点数

许多十进制小数在二进制中是无限循环的。例如:

• 0.1(十进制)= 0.000110011001100110011001100110011…(二进制)
• 0.2(十进制)= 0.001100110011001100110011001100110…(二进制)

由于计算机的存储空间有限,这些无限循环的二进制小数必须被截断,从而导致精度损失。

三、float相加时精度损失的原因分析

3.1 对齐问题

当两个浮点数相加时,计算机需要先对齐它们的指数。让我们看一个例子:
  1. public class FloatAlignmentExample {
  2.     public static void main(String[] args) {
  3.         // 一个大数和一个小数相加
  4.         float large = 1000000.0f;
  5.         float small = 0.1f;
  6.         float sum = large + small;
  7.         
  8.         System.out.println("1000000.0 + 0.1 = " + sum); // 输出:1000000.0 + 0.1 = 1000000.0
  9.         System.out.println("结果是否等于1000000.0? " + (sum == large)); // 输出:结果是否等于1000000.0? true
  10.     }
  11. }
复制代码

在这个例子中,1000000.0和0.1相加的结果仍然是1000000.0,这是因为它们的指数相差太大,在对齐过程中,小数的有效位被”挤”出了浮点数的表示范围。

3.2 舍入误差

浮点数运算过程中,经常需要进行舍入。IEEE 754标准定义了多种舍入模式,Java默认使用”向最接近数舍入”(Round to Nearest)模式。
  1. public class RoundingErrorExample {
  2.     public static void main(String[] args) {
  3.         float sum = 0.0f;
  4.         
  5.         // 连续加0.1,十次
  6.         for (int i = 0; i < 10; i++) {
  7.             sum += 0.1f;
  8.         }
  9.         
  10.         System.out.println("0.1加10次的结果: " + sum); // 输出:0.1加10次的结果: 1.0000001
  11.         System.out.println("结果是否等于1.0? " + (sum == 1.0f)); // 输出:结果是否等于1.0? false
  12.     }
  13. }
复制代码

这个例子中,每次加0.1都会引入微小的舍入误差,这些误差累积起来,导致最终结果不等于预期的1.0。

3.3 运算顺序的影响

浮点数的运算顺序也会影响最终结果。由于浮点数不满足结合律,不同的运算顺序可能导致不同的结果。
  1. public class OperationOrderExample {
  2.     public static void main(String[] args) {
  3.         float a = 1.0f;
  4.         float b = 3.0E-8f;
  5.         float c = -b;
  6.         
  7.         // (a + b) + c
  8.         float result1 = (a + b) + c;
  9.         
  10.         // a + (b + c)
  11.         float result2 = a + (b + c);
  12.         
  13.         System.out.println("(1.0 + 3.0E-8) + (-3.0E-8) = " + result1);
  14.         System.out.println("1.0 + (3.0E-8 + (-3.0E-8)) = " + result2);
  15.         System.out.println("两种计算方式的结果是否相等? " + (result1 == result2));
  16.     }
  17. }
复制代码

在这个例子中,由于运算顺序的不同,最终结果可能会有微小的差异。在需要高精度的计算中,这种差异可能是致命的。

四、BigDecimal解决方案

为了解决浮点数精度问题,Java提供了BigDecimal类,它可以精确表示十进制小数,并提供精确的算术运算。

4.1 BigDecimal的基本用法
  1. import java.math.BigDecimal;
  2. public class BigDecimalBasicExample {
  3.     public static void main(String[] args) {
  4.         // 使用字符串构造BigDecimal,避免使用double或float构造
  5.         BigDecimal a = new BigDecimal("0.1");
  6.         BigDecimal b = new BigDecimal("0.2");
  7.         BigDecimal sum = a.add(b);
  8.         
  9.         System.out.println("0.1 + 0.2 = " + sum); // 输出:0.1 + 0.2 = 0.3
  10.         System.out.println("结果是否等于0.3? " + sum.equals(new BigDecimal("0.3"))); // 输出:结果是否等于0.3? true
  11.         
  12.         // 减法
  13.         BigDecimal c = new BigDecimal("1.0");
  14.         BigDecimal d = new BigDecimal("0.9");
  15.         BigDecimal e = new BigDecimal("0.1");
  16.         BigDecimal result = c.subtract(d.add(e));
  17.         
  18.         System.out.println("1.0 - (0.9 + 0.1) = " + result); // 输出:1.0 - (0.9 + 0.1) = 0.0
  19.     }
  20. }
复制代码

4.2 BigDecimal的构造方法注意事项

BigDecimal提供了多种构造方法,但使用时需要注意:
  1. import java.math.BigDecimal;
  2. public class BigDecimalConstructorExample {
  3.     public static void main(String[] args) {
  4.         // 推荐使用字符串构造
  5.         BigDecimal fromString = new BigDecimal("0.1");
  6.         System.out.println("使用字符串构造的0.1: " + fromString);
  7.         
  8.         // 不推荐使用double构造,会引入double本身的精度问题
  9.         BigDecimal fromDouble = new BigDecimal(0.1);
  10.         System.out.println("使用double构造的0.1: " + fromDouble);
  11.         
  12.         // 可以使用valueOf方法,它会先将double转换为字符串
  13.         BigDecimal fromValueOf = BigDecimal.valueOf(0.1);
  14.         System.out.println("使用valueOf构造的0.1: " + fromValueOf);
  15.         
  16.         // 比较三种构造方法的结果
  17.         System.out.println("fromString.equals(fromDouble): " + fromString.equals(fromDouble));
  18.         System.out.println("fromString.equals(fromValueOf): " + fromString.equals(fromValueOf));
  19.     }
  20. }
复制代码

从上面的例子可以看出,使用double构造BigDecimal会引入double本身的精度问题,因此推荐使用字符串构造或者使用valueOf方法。

4.3 BigDecimal的运算方法

BigDecimal提供了多种算术运算方法,每种方法都可以指定精度和舍入模式:
  1. import java.math.BigDecimal;
  2. import java.math.RoundingMode;
  3. public class BigDecimalOperationsExample {
  4.     public static void main(String[] args) {
  5.         BigDecimal a = new BigDecimal("10.5");
  6.         BigDecimal b = new BigDecimal("3.0");
  7.         
  8.         // 加法
  9.         BigDecimal sum = a.add(b);
  10.         System.out.println("10.5 + 3.0 = " + sum);
  11.         
  12.         // 减法
  13.         BigDecimal difference = a.subtract(b);
  14.         System.out.println("10.5 - 3.0 = " + difference);
  15.         
  16.         // 乘法
  17.         BigDecimal product = a.multiply(b);
  18.         System.out.println("10.5 × 3.0 = " + product);
  19.         
  20.         // 除法,需要指定精度和舍入模式
  21.         BigDecimal quotient = a.divide(b, 2, RoundingMode.HALF_UP);
  22.         System.out.println("10.5 ÷ 3.0 (保留2位小数) = " + quotient);
  23.         
  24.         // 幂运算
  25.         BigDecimal power = a.pow(2);
  26.         System.out.println("10.5² = " + power);
  27.         
  28.         // 取绝对值
  29.         BigDecimal abs = a.negate().abs();
  30.         System.out.println("|-10.5| = " + abs);
  31.         
  32.         // 比较大小
  33.         int comparison = a.compareTo(b);
  34.         if (comparison > 0) {
  35.             System.out.println(a + " > " + b);
  36.         } else if (comparison < 0) {
  37.             System.out.println(a + " < " + b);
  38.         } else {
  39.             System.out.println(a + " = " + b);
  40.         }
  41.     }
  42. }
复制代码

4.4 BigDecimal的舍入模式

BigDecimal提供了多种舍入模式,可以根据需要选择:
  1. import java.math.BigDecimal;
  2. import java.math.RoundingMode;
  3. public class BigDecimalRoundingExample {
  4.     public static void main(String[] args) {
  5.         BigDecimal number = new BigDecimal("2.35");
  6.         
  7.         // 向上舍入(远离零)
  8.         BigDecimal roundUp = number.setScale(1, RoundingMode.UP);
  9.         System.out.println("UP: " + roundUp);
  10.         
  11.         // 向下舍入(趋向零)
  12.         BigDecimal roundDown = number.setScale(1, RoundingMode.DOWN);
  13.         System.out.println("DOWN: " + roundDown);
  14.         
  15.         // 向正无穷舍入
  16.         BigDecimal roundCeiling = number.setScale(1, RoundingMode.CEILING);
  17.         System.out.println("CEILING: " + roundCeiling);
  18.         
  19.         // 向负无穷舍入
  20.         BigDecimal roundFloor = number.setScale(1, RoundingMode.FLOOR);
  21.         System.out.println("FLOOR: " + roundFloor);
  22.         
  23.         // 向最接近数舍入,如果两边距离相等则向上舍入
  24.         BigDecimal roundHalfUp = number.setScale(1, RoundingMode.HALF_UP);
  25.         System.out.println("HALF_UP: " + roundHalfUp);
  26.         
  27.         // 向最接近数舍入,如果两边距离相等则向下舍入
  28.         BigDecimal roundHalfDown = number.setScale(1, RoundingMode.HALF_DOWN);
  29.         System.out.println("HALF_DOWN: " + roundHalfDown);
  30.         
  31.         // 向最接近数舍入,如果两边距离相等则向偶数舍入(银行家舍入法)
  32.         BigDecimal roundHalfEven = number.setScale(1, RoundingMode.HALF_EVEN);
  33.         System.out.println("HALF_EVEN: " + roundHalfEven);
  34.     }
  35. }
复制代码

4.5 使用BigDecimal解决实际问题

让我们看一个使用BigDecimal解决实际问题的例子,比如计算贷款月供:
  1. import java.math.BigDecimal;
  2. import java.math.RoundingMode;
  3. public class LoanCalculator {
  4.     public static void main(String[] args) {
  5.         // 贷款本金
  6.         BigDecimal principal = new BigDecimal("100000");
  7.         
  8.         // 年利率
  9.         BigDecimal annualRate = new BigDecimal("0.049");
  10.         
  11.         // 贷款年限
  12.         int years = 30;
  13.         
  14.         // 计算月利率
  15.         BigDecimal monthlyRate = annualRate.divide(new BigDecimal("12"), 10, RoundingMode.HALF_UP);
  16.         
  17.         // 计算还款月数
  18.         int months = years * 12;
  19.         
  20.         // 计算月供:月供 = 本金 × 月利率 × (1 + 月利率)^还款月数 ÷ ((1 + 月利率)^还款月数 - 1)
  21.         BigDecimal onePlusRate = monthlyRate.add(BigDecimal.ONE);
  22.         BigDecimal power = onePlusRate.pow(months);
  23.         BigDecimal numerator = monthlyRate.multiply(power);
  24.         BigDecimal denominator = power.subtract(BigDecimal.ONE);
  25.         BigDecimal monthlyPayment = principal.multiply(numerator).divide(denominator, 2, RoundingMode.HALF_UP);
  26.         
  27.         System.out.println("贷款本金: " + principal + "元");
  28.         System.out.println("年利率: " + annualRate.multiply(new BigDecimal("100")) + "%");
  29.         System.out.println("贷款年限: " + years + "年");
  30.         System.out.println("月供: " + monthlyPayment + "元");
  31.         
  32.         // 计算总还款额
  33.         BigDecimal totalPayment = monthlyPayment.multiply(new BigDecimal(months));
  34.         System.out.println("总还款额: " + totalPayment + "元");
  35.         
  36.         // 计算总利息
  37.         BigDecimal totalInterest = totalPayment.subtract(principal);
  38.         System.out.println("总利息: " + totalInterest + "元");
  39.     }
  40. }
复制代码

这个例子展示了如何使用BigDecimal进行精确的金融计算,避免了浮点数精度问题带来的误差。

五、如何在实际开发中应对浮点数运算挑战

5.1 何时使用BigDecimal

在以下场景中,应该优先考虑使用BigDecimal:

1. 金融计算:如贷款计算、利息计算、货币转换等。
2. 科学计算:需要高精度的科学和工程计算。
3. 商业应用:涉及金额、税率、折扣等需要精确计算的场景。
4. 需要精确十进制表示的场景:如0.1、0.2这样的十进制小数。
  1. import java.math.BigDecimal;
  2. public class WhenToUseBigDecimal {
  3.     public static void main(String[] args) {
  4.         // 金融计算示例
  5.         BigDecimal accountBalance = new BigDecimal("1000.00");
  6.         BigDecimal interestRate = new BigDecimal("0.025"); // 2.5%
  7.         BigDecimal interest = accountBalance.multiply(interestRate);
  8.         BigDecimal newBalance = accountBalance.add(interest);
  9.         
  10.         System.out.println("原始余额: " + accountBalance);
  11.         System.out.println("利息: " + interest);
  12.         System.out.println("新余额: " + newBalance);
  13.         
  14.         // 商品折扣计算示例
  15.         BigDecimal originalPrice = new BigDecimal("99.99");
  16.         BigDecimal discountRate = new BigDecimal("0.2"); // 20%折扣
  17.         BigDecimal discountAmount = originalPrice.multiply(discountRate);
  18.         BigDecimal discountedPrice = originalPrice.subtract(discountAmount);
  19.         
  20.         System.out.println("原价: " + originalPrice);
  21.         System.out.println("折扣金额: " + discountAmount);
  22.         System.out.println("折后价: " + discountedPrice);
  23.     }
  24. }
复制代码

5.2 何时可以使用float/double

虽然BigDecimal提供了高精度计算,但它也有一些缺点,如性能较低、使用复杂等。在以下场景中,可以考虑使用float或double:

1. 图形和游戏开发:对性能要求高,可以接受微小误差。
2. 科学计算中的某些场景:当误差在可接受范围内,且需要高性能时。
3. 简单的比较和排序:当不需要精确计算,只需要大致比较时。
  1. public class WhenToUseFloatDouble {
  2.     public static void main(String[] args) {
  3.         // 图形计算示例
  4.         float x = 1.5f;
  5.         float y = 2.7f;
  6.         float distance = (float) Math.sqrt(x * x + y * y);
  7.         System.out.println("点(" + x + ", " + y + ")到原点的距离: " + distance);
  8.         
  9.         // 物理模拟示例
  10.         double velocity = 9.8; // 初始速度
  11.         double time = 1.5;     // 时间
  12.         double acceleration = 9.8; // 加速度
  13.         double displacement = velocity * time + 0.5 * acceleration * time * time;
  14.         System.out.println("位移: " + displacement + "米");
  15.     }
  16. }
复制代码

5.3 性能与精度的权衡

BigDecimal虽然提供了高精度,但性能比float/double差很多。在实际开发中,需要根据具体需求权衡性能和精度。
  1. import java.math.BigDecimal;
  2. public class PerformanceComparison {
  3.     public static void main(String[] args) {
  4.         int iterations = 1000000;
  5.         
  6.         // float性能测试
  7.         long floatStartTime = System.currentTimeMillis();
  8.         float floatSum = 0.0f;
  9.         for (int i = 0; i < iterations; i++) {
  10.             floatSum += 0.1f;
  11.         }
  12.         long floatEndTime = System.currentTimeMillis();
  13.         System.out.println("float计算结果: " + floatSum);
  14.         System.out.println("float计算时间: " + (floatEndTime - floatStartTime) + "毫秒");
  15.         
  16.         // BigDecimal性能测试
  17.         long bigDecimalStartTime = System.currentTimeMillis();
  18.         BigDecimal bigDecimalSum = BigDecimal.ZERO;
  19.         BigDecimal addend = new BigDecimal("0.1");
  20.         for (int i = 0; i < iterations; i++) {
  21.             bigDecimalSum = bigDecimalSum.add(addend);
  22.         }
  23.         long bigDecimalEndTime = System.currentTimeMillis();
  24.         System.out.println("BigDecimal计算结果: " + bigDecimalSum);
  25.         System.out.println("BigDecimal计算时间: " + (bigDecimalEndTime - bigDecimalStartTime) + "毫秒");
  26.     }
  27. }
复制代码

运行上述代码,你会发现BigDecimal的计算时间远大于float。因此,在性能敏感的场景中,如果可以接受一定的误差,可以考虑使用float或double。

5.4 最佳实践和注意事项

1. 使用字符串构造BigDecimal:避免使用double或float构造BigDecimal,以免引入精度问题。
  1. // 推荐
  2. BigDecimal good = new BigDecimal("0.1");
  3. // 不推荐
  4. BigDecimal bad = new BigDecimal(0.1);
复制代码

1. 指定精度和舍入模式:在进行除法等运算时,始终指定精度和舍入模式。
  1. BigDecimal a = new BigDecimal("1");
  2. BigDecimal b = new BigDecimal("3");
  3. // 推荐,指定精度和舍入模式
  4. BigDecimal good = a.divide(b, 10, RoundingMode.HALF_UP);
  5. // 不推荐,可能会抛出ArithmeticException
  6. // BigDecimal bad = a.divide(b);
复制代码

1. 避免混合使用BigDecimal和基本类型:在比较和运算时,尽量保持类型一致。
  1. BigDecimal a = new BigDecimal("1.0");
  2. float b = 1.0f;
  3. // 不推荐,可能会引入精度问题
  4. boolean bad = a.doubleValue() == b;
  5. // 推荐
  6. boolean good = a.equals(BigDecimal.valueOf(b));
复制代码

1. 使用compareTo而不是equals比较BigDecimal:BigDecimal的equals方法不仅比较值,还比较精度,而compareTo只比较值。
  1. BigDecimal a = new BigDecimal("1.0");
  2. BigDecimal b = new BigDecimal("1.00");
  3. System.out.println("a.equals(b): " + a.equals(b)); // 输出:false
  4. System.out.println("a.compareTo(b) == 0: " + (a.compareTo(b) == 0)); // 输出:true
复制代码

1. 考虑使用工具类简化BigDecimal操作:可以创建工具类来简化BigDecimal的常见操作。
  1. import java.math.BigDecimal;
  2. import java.math.RoundingMode;
  3. public class BigDecimalUtils {
  4.     // 默认精度
  5.     private static final int DEFAULT_SCALE = 2;
  6.    
  7.     // 默认舍入模式
  8.     private static final RoundingMode DEFAULT_ROUNDING_MODE = RoundingMode.HALF_UP;
  9.    
  10.     // 加法
  11.     public static BigDecimal add(BigDecimal a, BigDecimal b) {
  12.         return add(a, b, DEFAULT_SCALE);
  13.     }
  14.    
  15.     public static BigDecimal add(BigDecimal a, BigDecimal b, int scale) {
  16.         return a.add(b).setScale(scale, DEFAULT_ROUNDING_MODE);
  17.     }
  18.    
  19.     // 减法
  20.     public static BigDecimal subtract(BigDecimal a, BigDecimal b) {
  21.         return subtract(a, b, DEFAULT_SCALE);
  22.     }
  23.    
  24.     public static BigDecimal subtract(BigDecimal a, BigDecimal b, int scale) {
  25.         return a.subtract(b).setScale(scale, DEFAULT_ROUNDING_MODE);
  26.     }
  27.    
  28.     // 乘法
  29.     public static BigDecimal multiply(BigDecimal a, BigDecimal b) {
  30.         return multiply(a, b, DEFAULT_SCALE);
  31.     }
  32.    
  33.     public static BigDecimal multiply(BigDecimal a, BigDecimal b, int scale) {
  34.         return a.multiply(b).setScale(scale, DEFAULT_ROUNDING_MODE);
  35.     }
  36.    
  37.     // 除法
  38.     public static BigDecimal divide(BigDecimal a, BigDecimal b) {
  39.         return divide(a, b, DEFAULT_SCALE);
  40.     }
  41.    
  42.     public static BigDecimal divide(BigDecimal a, BigDecimal b, int scale) {
  43.         return a.divide(b, scale, DEFAULT_ROUNDING_MODE);
  44.     }
  45.    
  46.     // 使用示例
  47.     public static void main(String[] args) {
  48.         BigDecimal a = new BigDecimal("10.5");
  49.         BigDecimal b = new BigDecimal("3.0");
  50.         
  51.         System.out.println("加法: " + add(a, b));
  52.         System.out.println("减法: " + subtract(a, b));
  53.         System.out.println("乘法: " + multiply(a, b));
  54.         System.out.println("除法: " + divide(a, b));
  55.     }
  56. }
复制代码

六、总结

本文深入探讨了Java中float相加的精度问题,从浮点数的表示原理到精度损失的原因分析,再到BigDecimal解决方案,最后提供了实际开发中的最佳实践。

通过本文,我们了解到:

1. Java中的float遵循IEEE 754标准,使用32位二进制表示浮点数,包括符号位、指数位和尾数位。
2. 许多十进制小数在二进制中是无限循环的,无法精确表示,这是浮点数精度问题的根本原因。
3. 浮点数相加时存在对齐问题、舍入误差等问题,导致精度损失。
4. BigDecimal是解决浮点数精度问题的有效工具,它可以精确表示十进制小数,并提供精确的算术运算。
5. 在实际开发中,需要根据具体需求权衡使用BigDecimal还是float/double,并遵循最佳实践。

正确理解浮点数的特性和BigDecimal的使用方法,可以帮助我们在实际开发中避免精度问题,写出更加健壮和可靠的代码。
「七転び八起き(ななころびやおき)」
回复

使用道具 举报

4

主题

47

科技点

361

积分

候风辨气

积分
361

三倍冰淇淋柴到了

候风辨气 发表于 2025-9-8 11:26:06 | 显示全部楼层
知识+1,谢谢大佬分享
Fumo Fumo
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则