【问题标题】:JAVA DecimalFormat Rounding IssueJAVA DecimalFormat 舍入问题
【发布时间】:2017-05-22 13:42:56
【问题描述】:

我正在尝试使用简单的十进制格式化程序,但得到了意想不到的结果:

float amt = 61.0349998474121F;
    float amt1 = 4.5850000381470F;

    DecimalFormat m_numberFormat2DP = new DecimalFormat("0.000");
    System.out.println(m_numberFormat2DP.getRoundingMode());
    System.out.println(m_numberFormat2DP.format(amt));
    System.out.println(m_numberFormat2DP.format(amt1));

    DecimalFormat m_numberFormat2DP1 = new DecimalFormat("0.00");
    //m_numberFormat2DP1.setRoundingMode(RoundingMode.HALF_UP);
    System.out.println(m_numberFormat2DP1.getRoundingMode());
    System.out.println(m_numberFormat2DP1.format(amt));//result should be 61.04
    System.out.println(m_numberFormat2DP1.format(amt1));//result should be 4.59

这也是我尝试过的代码 half_up,但结果与我收到的最后一个 SOP 的输出相同,即 61.03 和 4.59。 61.03 应该是 61.04

【问题讨论】:

  • 61.03 和 4.59 对我来说似乎是正确的
  • 61.03 should be 61.04 不应该,61.034 舍入到 61.03,无论你是否舍入 HALF_UP。您可能正在寻找CEILING,其中的值将被限制为下一个整数而不是四舍五入。
  • 由于您尝试将 61.034999 舍入为 61.04,因此您似乎希望最多获得 2 个小数位数。因此,您可以尝试将输入 + 0.001 舍入,即 61.034999 + 0.001 = 61.035999,然后应该将一半舍入到 61.04
  • 为什么 61.03 根据四舍五入看起来我是正确的
  • @XtremeBaumer 看起来我们没有正确的舍入定义。多次四舍五入会导致错误。 0.49999

标签: java decimalformat


【解决方案1】:

61.034 将始终四舍五入为 61.03,因为四舍五入会得到最接近的整数。

HALF_UP / HALF_DOWN 仅影响两个整数之间的限制值,即3.5 将四舍五入为4HALF_UP,但3HALF_DOWN

您似乎正在寻找的不是舍入函数,而是一个上限函数,其中的值将被带到最接近的上述整数:61.03461.043.54,等等

方便地,RoundingMode 枚举通过其RoundingMode.CEILING 字段为DecimalFormat 提供此类功能:

DecimalFormat m_numberFormat2DP1 = new DecimalFormat("0.00");
m_numberFormat2DP1.setRoundingMode(RoundingMode.CEILING);
System.out.println(m_numberFormat2DP1.getRoundingMode());
System.out.println(m_numberFormat2DP1.format(amt));//result is 61.04
System.out.println(m_numberFormat2DP1.format(amt1));//result is 4.59

你可以在here看到它。

【讨论】:

    【解决方案2】:
    public class DecimalFormatDemo {  
     public static void main(String args[]) {  
     DecimalFormat df1 = new DecimalFormat("###,###.0000");  
     System.out.println(df1.format(111111123456.12));  
    
     Locale.setDefault(Locale.US);  
     DecimalFormat df2= new DecimalFormat("###,###.0000");
     System.out.println(df2.format(111111123456.12));  
    
     DecimalFormat df3= new DecimalFormat();  
     myformat3.applyPattern("##,###.000");  
     System.out.println(df3.format(11112345.12345));  
    
    
    
    
      DecimalFormat df4= new DecimalFormat();  
      myformat4.applyPattern("0.000E0000");  
      System.out.println(df4.format(10000));  
      System.out.println(df4.format(12345678.345));  
    
    
      DecimalFormat df5= null;  
      try{  
         df5= (DecimalFormat)NumberFormat.getPercentInstance();  
     }catch(ClassCastException e){  
      <span style="white-space:pre">  </span> System.err.println(e);  
     }  
     df5.applyPattern("00.0000%");  
     System.out.println(df5.format(0.34567));  
     System.out.println(df5.format(1.34567));        
    

    }
    } 希望能帮到你

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-23
      • 1970-01-01
      相关资源
      最近更新 更多