刷算法题day04-错误总结(Double精度)

Double精度问题

int Parts = (int) Math.ceil((double) (string.length()/ k));

没有关注到精度问题导致

String[] chars = new String[Parts];

数组长度小一个,这样就导致后面导入数组的时候少导入一个,从而导致结果错误。

解决办法

  1. 使用 BigDecimalBigDecimal 类提供了精确的浮点数运算。你可以通过指定小数点后的位数和舍入模式来控制除法的精度。

    BigDecimal a = new BigDecimal("10.5"); BigDecimal b = new BigDecimal("3"); 
    BigDecimal result = a.divide(b, 2, RoundingMode.HALF_UP); // 保留两位小数,使用四舍五入 System.out.println(result); // 输出 "3.50"

    在这个例子中,我们使用 BigDecimaldivide 方法来执行除法,并指定了结果的小数位数和舍入模式。

  2. 扩大被除数的规模: 有时,通过扩大被除数的规模(例如,乘以 10 的幂)可以使除法结果更加精确。

    double a = 10.5; 
    double b = 3; 
    double result = (a * 100) / b; // 将被除数扩大 100 倍 result = Math.round(result * 100) / 100; // 再将结果缩小回原来的规模 System.out.println(result); // 输出 "3.5"

    请注意,这种方法可能不会总是提高精度,特别是当扩大规模导致溢出时。

  3. 避免直接使用 floatdouble: 如果可能,尽量避免使用 floatdouble 类型进行精确计算。如果你需要存储精确的小数,考虑使用 BigDecimal 或者整数类型(例如,以分为单位代替以元为单位)。

  4. 使用 RoundingMode: 当使用 BigDecimal 时,选择合适的 RoundingMode 对舍入行为进行控制非常重要。RoundingMode 提供了多种舍入模式,例如 HALF_UPHALF_DOWNHALF_EVEN 等。

  5. 检查除数是否为零: 在执行除法之前,始终检查除数是否为零,以避免 ArithmeticException 异常。

    if (b == 0) { throw new ArithmeticException("Division by zero."); }

总的来说,如果你需要进行精确的除法运算,推荐使用 BigDecimal 类,并合理选择精度和舍入模式。这样可以确保你的计算结果既精确又可靠。

相关推荐

  1. 算法day04-错误总结Double精度

    2024-03-25 18:10:01       40 阅读
  2. 算法day07

    2024-03-25 18:10:01       55 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-25 18:10:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-25 18:10:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-25 18:10:01       82 阅读
  4. Python语言-面向对象

    2024-03-25 18:10:01       91 阅读

热门阅读

  1. ubuntu - 安装cmake

    2024-03-25 18:10:01       45 阅读
  2. http协议发展历程

    2024-03-25 18:10:01       38 阅读
  3. ES聚合查询

    2024-03-25 18:10:01       38 阅读
  4. 《被讨厌的勇气》书摘2

    2024-03-25 18:10:01       31 阅读
  5. Python学习目录

    2024-03-25 18:10:01       40 阅读
  6. C++ 运算符重载

    2024-03-25 18:10:01       42 阅读