【问题标题】:How to round numbers to two decimal places in java?如何在java中将数字四舍五入到小数点后两位?
【发布时间】:2014-03-02 12:39:58
【问题描述】:

所以我需要将诸如 143.203030 之类的双精度数更改为 143.20 向上或向下舍入第二个数字(如金钱),我的计划是将双精度数转换为一个数组,然后如果小数点后的第三个数字是 5 或更大element 会比原来大一。如何访问 double 的每个 int 以及如何将我的 int 数组转换回 double。现在......这显然是一种可怕而低效的方式,还有什么更好的主意。我会花时间编写代码,但我认为解释它并寻求更好的方法是一回事。好吧,实际上我无法编写代码,因为我不知道访问 double 的每个部分。

【问题讨论】:

标签: java arrays int double rounding


【解决方案1】:

试试这个:

public static roundHundredth(double d) {
  return (double)((int)(d*100)+.5)/100;
}

【讨论】:

  • @ajb 我明白了。我最初没有进行强制转换,但后来实现了它以考虑所需的舍入。
  • 这是小数点后 3 位,我不太确定它是如何工作的,你介意用一个例子来解释一下。似乎这种方式是最好的(对于初学者 java 程序员)除了数学之外,不要试图进入这个特定作业的其他课程。
  • @user3026468 “这是小数点后 3 位”是什么意思?使用您的原始示例:143.203030 * 10014320.3030。当您将其转换为(int) 时,它会去掉所有小数位并变为14320。当你除以 100 时,它变为 143.20.5 是为了确保像 143.209090 这样的东西会被收集起来。
【解决方案2】:

使用BigDecimal 类是一个更好的主意,尤其是在您使用金钱的情况下。它支持满足最常见的财务和工程要求的各种舍入模式。

为了满足您的迫切需求,您可以按如下方式使用BigDecimal(尽管最好从您的程序中删除double 类型并始终使用BigDecimal):

String[] round(double[] arr) {
  String[] r = new String[arr.length];
  for (int idx = 0; idx < arr.length; ++idx) {
    r[idx] = BigDecimal.valueOf(arr[idx]).setScale(2, RoundingMode.HALF_UP).toString();
  }
}

【讨论】:

    【解决方案3】:

    我同意您不应该使用 double 来存储货币价值(尽管对于较小的金额可能还可以)。进行这种舍入的一般方法是

    double rounded = Math.round(d * 100) / 100.0;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-26
      • 1970-01-01
      • 2010-09-20
      • 2016-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多