【问题标题】:Truncating double numbers截断双数
【发布时间】:2016-02-17 03:58:21
【问题描述】:

我正在使用一个计算最早截止日期算法的 java 程序。除了双数字外,一切似乎都运行良好。当我计算平均值(周转时间和等待时间)时,通常答案是这样的:

18.566666666666663

我想删减(不四舍五入)答案到小数点后两位,所以答案应该是:

18.56

好的,所以我尝试在控制台屏幕上打印结果:

System.out.println (String.format ("%.2f", ttAve)); // ttAve contains 18.566666666666663

但是,打印时数字会四舍五入:

18.57

我该怎么办?

【问题讨论】:

  • 提示:首先将您的答案乘以 100。仅供参考:您想要的通常术语是“截断”。
  • 或者把大数转成字符串再格式化。
  • 这就是我所做的:我将整个双精度数转换为字符串乘以 100。然后我尝试用分隔符点分割字符串。我将字符串解析回 double 但字符串似乎没有拆分。有没有更简单的方法?

标签: java numbers rounding number-formatting


【解决方案1】:

使用DecimalFormat:

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

请注意,System.out.printfDecimalFormat 都使用系统默认语言环境进行格式化,因此在某些国家/地区,您可能会意外看到 18,56 而不是 18.56。如果不希望这样,您可以明确指定语言环境:

DecimalFormat df = new DecimalFormat("#.##", 
                                     DecimalFormatSymbols.getInstance(Locale.ENGLISH));
df.setRoundingMode(RoundingMode.DOWN);
System.out.println(df.format(18.566666666666663));

【讨论】:

  • 谢谢你!它解决了我的问题!对于那些偶然发现同样问题的人来说,只是一个简短的说明:DecimalFormat 来自 java.text 包;语言环境来自 java.util 包; RoundingMode 来自 java.math 包。
【解决方案2】:

你可以做类似的事情

double cutValue = Math.floor(a * 100.0) / 100.0;

【讨论】:

  • 对于-18.5666,这种方法会产生-18.57。我不知道 OP 是否关心负数。
  • 塔吉尔是对的。但是用户输入负整数的可能性很小。但安全总比后悔好。谢谢!
【解决方案3】:

你可以使用这个方法:

float roundResult (float f) {
   int precise = 100;
   f = f * precise;
   int i = (int) f;
   return (float) i / precise;
}

【讨论】:

    【解决方案4】:

    你可以试试下面的代码吗?

    DecimalFormat format = new DecimalFormat("#.##");
    format.setRoundingMode(RoundingMode.FLOOR);
    System.out.println (format.format(ttAve));
    

    【讨论】:

      猜你喜欢
      • 2019-03-13
      • 1970-01-01
      • 2017-05-08
      • 2017-12-18
      • 1970-01-01
      • 2016-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多