【问题标题】:Rounding Off to 2 decimal places giving issues while summing up在总结时四舍五入到小数点后 2 位
【发布时间】:2014-06-27 13:01:45
【问题描述】:

得到以下几组数字-->

[5.1429,5.1429,5.1429,5.1429,5.1429,5.1429,5.1426]
[0.8333,0.8333,0.8333,0.8333,0.8333,0.8335]

添加后,它们会给出一个整数。

现在我们必须在四舍五入后显示这些数字,如下所示 -->

[5.14, 5.14, 5.14, 5.14, 5.14, 5.14, 5.14]
[0.83, 0.83, 0.83, 0.833, 0.83, 0.83]

这不是一个整数的总和。这导致整个总数类似于99.96101.01

有没有一种方法可以对数字进行四舍五入,使总数为整数。

我不是在寻找四舍五入的方法。我正在寻找一种方法来操纵已经四舍五入的数字(如 5.14、5.14 等),以便它们给出一个整数。 (如果有办法..那就是:))

【问题讨论】:

  • 请发布您的代码。你试过什么。以便其他人可以帮助您。
  • @OlegEstekhin 我真的不这么认为。他/她有一个由于四舍五入错误导致四舍五入不加到一百的问题
  • 你如何将[1/3, 1/3, 1/3]四舍五入到小数点后一位(为了争论)所以总和是1
  • 你只需要把答案四舍五入,所以只要把你的答案四舍五入就对了。

标签: java algorithm math percentage


【解决方案1】:

如果您通过减少第三位小数对输入进行排序并将所有内容向下四舍五入,您将引入最小的绝对舍入误差 - 同时保持总和不变。

举个简单的例子:

输入

0.132, 0.226, 0.257, 0.385 // sums up to 1.00

按小数点后第三位(降序)

0.257, 0.226, 0.385, 0.132

四舍五入

0.25, 0.22, 0.38, 0.13 // sums up to 0.98

四舍五入刚好可以达到整数

0.26, 0.23, 0.38, 0.13 // sums up to 1.00

在代码中(未经测试):

public void printRounded(double[] ds) {
    // create wrapper objects
    int n = ds.length;
    Wrapper[] ws = new Wrapper[n];
    for (int i = 0; i < n; i++)
        ws[i] = new Wrapper(i, (int)(ds[i] * 1000) % 10, (int)(ds[i] * 100));

    // sort by third decimal, descending
    Arrays.sort(ws, new Comparator<Wrapper>() {
        public int compare(Wrapper o1, Wrapper o2) {
            return o2.thirdDecimal.compareTo(o1.thirdDecimal);
        }
    });

    // find number of elements that must be rounded up and increment
    int sum = 0;
    for (int i = 0; i < n; i++)
        sum += ws[i].prefix;
    int numberToIncrement = 100 - (sum % 100);
    for (int i = 0; i < numberToIncrement ; i++)
        ws[i].prefix++;

    // sort back to input order
    Arrays.sort(ws, new Comparator<Wrapper>() {
        public int compare(Wrapper o1, Wrapper o2) {
            return o1.index.compareTo(o2.index);
        }
    });

    // print values
    for (int i = 0; i < n; i++) {
        System.out.println(ws[i].prefix / 100 + "." ws[i].prefix % 100);
    }
}

private class Wrapper {
    public Wrapper(int index, int thirdDecimal, int prefix) {
        this.index = index;
        this.thirdDecimal = thirdDecimal;
        this.prefix = prefix;
    }

    public int index;
    public int thirdDecimal;
    public int prefix;
}

您当然可以将整数转换回双精度并使用标准格式,而不是使用自定义格式。

【讨论】:

  • 在我的回答中,我指的是这样的事情。我没有像 Heuster 那样把它正式化。可能这个算法确实是最优的(在我正在考虑的情况下)。所以我要 +1。
  • @peter.petrov 我直到现在才看到你的答案;可能是我在你回答之前就开始打字了。这确实是几乎相同的想法:-)
【解决方案2】:

如果我将结果四舍五入,我会得到一个整数。

public static void main(String... ignored) {
    sum(5.1429, 5.1429, 5.1429, 5.1429, 5.1429, 5.1429, 5.1426);
    sum(0.8333, 0.8333, 0.8333, 0.8333, 0.8333, 0.8335);
}

private static void sum(double... xs) {
    double sum = 0;
    for (double x : xs) {
        sum += x;
    }
    System.out.printf("sum was %.2f%n", sum);
}

顺便说一句:如果您知道您需要一个整数,您应该四舍五入到一个整数,而不是两位小数。

【讨论】:

  • 在 main 方法中有趣地使用可变参数,我第一次看到它。感谢您的洞察力!
【解决方案3】:

除非您放弃坚定的要求,否则无法做到这一点
用于四舍五入您的数字(到小数点后 2 位)并允许

(a) 截断您的数字(小数点后第二位);
(b) 在实际需要向下/向上舍入时向上/向下舍入。

如果您允许这些操作(在某些数字上)而不是
将它们全部按本书四舍五入,那么您很可能会提出来
使用某种算法,甚至可以为您提供相同的(整数)总和
在对原件应用舍入/截断操作后
数字。但同样,这并不是真正的四舍五入(正如我们从数学中知道的那样)。

【讨论】:

  • 这是该算法的一个想法(尽管我认为这不是一个好主意):1)向下舍入所有数字,记住每个数字的舍入误差,2)检查总和的差异到下一个整数为x*.01,3) 将0.01 添加到具有最高舍入误差的x 数字。
【解决方案4】:

您可以这样做的一种方法是四舍五入到小数点后两位,然后将每个数字乘以一百,然后除以数字的总和。这应该让你接近 100,如果你迭代足够多的时间,你的结果应该接近 100。所以基本上(伪代码)

 lsum = 0
 vecNums = //previous numbers
 while abs(nsum -100) >.01
    for i in vecNums
       i = (i*100)/sum(vecNums)
 return vecNums

【讨论】:

    【解决方案5】:

    您可以像以前一样将它们相加,然后也将最后的总和四舍五入。

    【讨论】:

      【解决方案6】:

      你可以看看Math.round(double a)方法

      System.out.println(Math.round(12.51));//Yields 13
      System.out.println(Math.round(12.49));//Yields 12
      System.out.println(Math.round(12.50));//Yields 13
      

      来自Round off in JAVA

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-24
        • 2012-03-11
        • 1970-01-01
        相关资源
        最近更新 更多