【问题标题】:Java : Rounding a decimal value to HALF_EVENJava:将十进制值四舍五入为 HALF_EVEN
【发布时间】:2015-05-26 13:07:20
【问题描述】:

我一直在尝试编写一个 java 代码来将一个值舍入到以下要求。

如果 x=63.88 => roundedValue= 64.00;

如果 x=63.50 => roundedValue= 64.00

如果 x=63.32 => roundedValue= 63.32

我尝试了不同的舍入模式,例如 CEILING、DOWN、FLOOR、HALFDOWN。 我也试过 Math.round();

但我无法获得预期的输出。 我的输入是一个字符串,输出是一个字符串。

请在下面找到我试过的代码sn-p

BigDecimal value1 = new BigDecimal(input);
value1=value1.setScale(2, RoundingMode.HALF_EVEN);
//float rounded=Math.round(amount);

String finalValue=String.valueOf(value1);

我无法获得所需的输出。请告诉我如何实现这一目标?

ps:我应该考虑使用 float 还是 BigDecimal??

【问题讨论】:

  • 如果 x=63.32 => roundedValue= 63.32 ????
  • @SoumitriPattnaik - 是的
  • 您的规范没有意义,因为您根本没有四舍五入 63.32。如果不应用某种规则,我们将无能为力。
  • 你的意思是这样的:如果 x 向上取整,则向上取整,否则什么也不做?

标签: java math decimal rounding bigdecimal


【解决方案1】:
if(x%1 >= .5)
  { x = Math.round(x) }
else //do nothing

这似乎会为您提供所需的输出。因此,如果您真的想要,您可以覆盖或创建自己的方法来调用舍入

【讨论】:

  • >= .5 对于某些值可能会返回相当不友好的结果。我强烈建议使用 Double.compareTo / Double.compare
  • @Vogel612 - 不友好的结果像?你能提供一些例子吗?
  • 比较 (.7 - .2) >= .5 将返回 false,另请参阅:stackoverflow.com/a/30404771/1803692
  • 在尝试使用十进制舍入时,我不建议使用 double 和 float。使用十进制数进行十进制舍入,使用二进制数进行性能相关的事情。
【解决方案2】:

您想要做的是提供您自己的MathContext 来指定您想要执行的舍入行为。

最接近您当前要求的是:使用RoundingMode.HALF_UPRoundingMode.UNNECESSARY

为此,无论如何您都必须使用BigDecimal,因为 Double 和 Float 不公开舍入。

【讨论】:

    【解决方案3】:
    public static void main(String args[]) {
    
        Double d = 63.18;
        DecimalFormat df = new DecimalFormat("00.00");
    
        if(d % 1 >= 0.5) 
            System.out.println(df.format(Math.round(d)));
        else 
            System.out.println(d);
    }
    

    【讨论】:

      【解决方案4】:

      如您的帖子中所述,如果您想使用小数舍入,则可以使用BigDecimal

      如果您想对数字 >= X.5 进行四舍五入并避免对数字

      import java.math.BigDecimal;
      import java.math.RoundingMode;
      
      public class Round {
      
          public static void main(String[] args) {
              System.out.println(round("63.88"));
              System.out.println(round("63.50"));
              System.out.println(round("63.32"));
          }
      
          private static BigDecimal round(String input) {
              BigDecimal value = new BigDecimal(input);
      
              BigDecimal rounded = value.setScale(0, RoundingMode.HALF_UP);
              if (rounded.compareTo(value) > 0)
                  return rounded.setScale(2);
      
              return value;
          }
      
      }
      

      输出是:

      64.00
      64.00
      63.32
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多