【问题标题】:Java: function to round away from zero?Java:从零舍入的函数?
【发布时间】:2020-04-23 14:58:31
【问题描述】:

如何在 Java 中从零开始舍入一个双精度数?

我知道的操作不符合我的要求:

  • 将其转换为 (int) 会将其舍入为零。 (int) 3.7 将是 3, (int) - 3.9 将是 -3

  • Math.floor() 向负无穷大舍入。 Math.ceil(3.7) 将是 3.0Math.ceil(-3.9) 将是 -4.0

  • Math.ceil() 向正无穷方向舍入。 Math.floor(3.7) 将是 4.0Math.ceil(-3.9) 将是 -3.0
  • Math.round() 向最接近的整数舍入。

但是我没有从零四舍五入的东西,例如 3.7 变成 4.0-3.9 变成 -4.0

Java中有这样的功能吗?

【问题讨论】:

  • 问得好,研究和例子很好。
  • 在您的示例中,地板指的是 ceil,而 ceil 指的是地板。

标签: java rounding


【解决方案1】:

检查号码的符号:

double roundedAway = (num >= 0) ? Math.ceil(num) : Math.floor(num)

【讨论】:

    【解决方案2】:

    您可以根据您的数字是正数还是负数来实现自己的函数,也可以使用RoundingMode。它可以使用UP 显式地从零舍入

    它可能看起来像这样

    DecimalFormat df = new DecimalFormat("#.#");
    df.setRoundingMode(RoundingMode.UP);
    System.out.println(df.format(number_here));
    

    【讨论】:

    • 这会将双精度转换为String,而不是将其保留为双精度。如果这就是双重发生的事情,那很好;但否则你必须从字符串中解析回来。
    【解决方案3】:

    可以通过RoundingModeBigDecimal来完成:

    double roundAway(double value) {
        return new BigDecimal(value).setScale(0, RoundingMode.UP).doubleValue();
    }
    

    注意:这会将double 转换为具有双精度值的BigDecimal。为避免这种情况,您可以使用 BigDecimal.valueOf(double) 而不是使用双精度的规范字符串表示的构造函数,但是由于您要将其四舍五入为整数,这将涉及到不必要的字符串转换。有关详细信息,请参阅constructor documentation

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多