首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >四舍五入到小数点2位,在总结问题的同时给出问题

四舍五入到小数点2位,在总结问题的同时给出问题
EN

Stack Overflow用户
提问于 2014-06-27 13:01:45
回答 6查看 886关注 0票数 0

得到以下几组数字->

代码语言:javascript
复制
[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]

如果加起来,这些就会给出一个完整的数字。

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

代码语言:javascript
复制
[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)。所以他们给出了一个完整的数字。(如果有办法..。即:)

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-06-27 13:54:49

您将引入最小的绝对舍入误差--同时保持总和不变--如果您通过减少第三小数点并将所有内容整整来对输入进行排序,除了刚好有足够的数字达到目标之外。

作为一个简单的例子:

输入

代码语言:javascript
复制
0.132, 0.226, 0.257, 0.385 // sums up to 1.00

按第三小数点(降序)排序

代码语言:javascript
复制
0.257, 0.226, 0.385, 0.132

把所有的事情都围住了

代码语言:javascript
复制
0.25, 0.22, 0.38, 0.13 // sums up to 0.98

集合刚好可以达到一个整数

代码语言:javascript
复制
0.26, 0.23, 0.38, 0.13 // sums up to 1.00

在代码中(未经测试):

代码语言:javascript
复制
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;
}

当然,与使用自定义格式不同,您可以将ints转换回double,并使用标准格式。

票数 2
EN

Stack Overflow用户

发布于 2014-06-27 13:09:14

除非你放弃严格的要求,否则是不可能做到这一点的

使你的数字四舍五入(小数点2位),并允许

(a)截断你的数字(在小数点第二位之后);

(b)当你实际需要四舍五入时,上上下下。

如果允许这些操作(在某些数字上)而不是

按书把所有的人都围在一起,那么你很可能就能找到

用一些算法给出相同的(积分)和偶数

在将舍入/截断操作应用于原始

数字。但同样,这并不是真正的四舍五入(我们从数学中知道)。

票数 1
EN

Stack Overflow用户

发布于 2014-06-27 13:13:32

如果我把结果加起来,我就会得到一个完整的数字。

代码语言:javascript
复制
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);
}

顺便说一句:如果你知道你期望的是一个整数,你应该把它整到一个整数,而不是小数点的两位。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24452497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档