得到以下几组数字->
[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.96或101.01。
我们有没有办法把数字相乘,使总数达到整数。
我不是在找一种方法来抵消这笔钱。我正在寻找一种方法来操纵已经四舍五入的数字(比如5.14,5.14)。所以他们给出了一个完整的数字。(如果有办法..。即:)
发布于 2014-06-27 13:54:49
您将引入最小的绝对舍入误差--同时保持总和不变--如果您通过减少第三小数点并将所有内容整整来对输入进行排序,除了刚好有足够的数字达到目标之外。
作为一个简单的例子:
输入
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;
}当然,与使用自定义格式不同,您可以将ints转换回double,并使用标准格式。
发布于 2014-06-27 13:09:14
除非你放弃严格的要求,否则是不可能做到这一点的
使你的数字四舍五入(小数点2位),并允许
(a)截断你的数字(在小数点第二位之后);
(b)当你实际需要四舍五入时,上上下下。
如果允许这些操作(在某些数字上)而不是
按书把所有的人都围在一起,那么你很可能就能找到
用一些算法给出相同的(积分)和偶数
在将舍入/截断操作应用于原始
数字。但同样,这并不是真正的四舍五入(我们从数学中知道)。
发布于 2014-06-27 13:13:32
如果我把结果加起来,我就会得到一个完整的数字。
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);
}顺便说一句:如果你知道你期望的是一个整数,你应该把它整到一个整数,而不是小数点的两位。
https://stackoverflow.com/questions/24452497
复制相似问题