【问题标题】:Round according to nearest decimal value - java根据最接近的十进制值四舍五入 - java
【发布时间】:2021-01-06 09:24:55
【问题描述】:

我用过这个

Math.round(input * 100.0) / 100.0;

但它不符合我的要求。我想根据最接近的十进制值四舍五入到小数点后两位。

首先我想检查第四个十进制值 如果是 5 或以上我想将 1 添加到第 3 个十进制值 然后想检查第三个 如果是 5 或以上,我想将 1 添加到第二个中

例如:如果我有 22.3246

参考上面的示例编号。第 4 位小数是 6。 我们可以将 1 添加到第 3 个十进制值中。

结果:22.325

现在第 3 位小数是 5。我们可以将 1 加到第 2 位小数中

结果:22.33

我想得到结果 22.33

【问题讨论】:

  • 您是否知道您想要的结果 22.33(就与原始值的距离而言)比标准舍入结果 22.32 差?
  • @RalfKleberhoff 是的,我知道。但这是要求。

标签: java decimal rounding


【解决方案1】:

如果你想尊重第 4 位小数,你可以这样做:

double val = Math.round(22.3246 * 1000.0) / 1000.0;
double result = Math.round(val * 100.0) / 100.0;
System.out.println(result); // print: 22.33

【讨论】:

    【解决方案2】:

    您可以使用BigDecimal 类来完成此任务,并结合使用比例尺和RoundingMode.HALF_UP

    示例代码:

    System.out.println(new BigDecimal("22.3246").divide(BigDecimal.ONE,3,RoundingMode.HALF_UP)
                        .divide(BigDecimal.ONE,2,RoundingMode.HALF_UP));
    

    输出:

    22.33
    

    【讨论】:

      【解决方案3】:

      根据您的要求,向下舍入到22.32 的最大数字是22.3244444444...。从22.32444...4445 开始,逐位迭代舍入将导致22.33

      因此,您可以添加0.005 - 0.0044444444(标准舍入阈值减去您的阈值)的偏差,即5/9000,然后以标准方式舍入到下一个1/100

          double BIAS = 5.0 / 9000.0;
          double result = Math.round((input + BIAS) * 100.0) / 100.0;
      

      【讨论】:

        猜你喜欢
        • 2011-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-11
        • 1970-01-01
        • 2011-11-06
        相关资源
        最近更新 更多