如何将 java 中的双精度数除以整数?
How to divide a double into whole integers in java?
好的,所以我有以下问题,最好用一个具体的例子来解释。
给定一个 double、x(比如 100.5)和一个 int y(比如 3),我如何将其分成(大致相等的)部分和 return 包含 33、33 和 34.5 的列表.
我希望列表中的所有元素都是整数(整数),除了最后一个。
当前代码:
private List<Double> splitIntoApproxEqualParts(double number, int numParts) {
List<Double> result = new ArrayList<Double>();
if (numParts <= 0) { return result; }
double qty = Math.floor(number / numParts);
for (int i = 0; i < numParts - 1; i++) {
result.add(qty);
}
result.add(qty + 1);
return result;
}
显然这不适用于 numParts < number 和其他情况。
最优雅的方法是什么?
如何使用
public BigDecimal setScale(int newScale, int roundingMode)
对于所有情况,将比例设置为零并向下舍入。
然后遍历所有并保留 运行 总数,可以 diff'd
并添加到最后一个数字
我认为您几乎有了一个完整的解决方案,为 1 个部分添加一个处理程序,然后使用您现有的 qty
(但从最后一个条目的原始 number
中减去它)。比如,
private static List<Double> splitIntoApproxEqualParts(double number, int numParts) {
if (numParts <= 0) {
return Collections.emptyList();
} else if (numParts == 1) {
return Arrays.asList(number);
}
List<Double> result = new ArrayList<>(numParts);
double qty = Math.floor(number / numParts);
int t = numParts - 1;
IntStream.range(0, t).forEach(x -> result.add(qty));
result.add(number - (qty * t));
return result;
}
我觉得你还差得远,
private List<Double> splitIntoApproxEqualParts(double number, int numParts) {
List<Double> result = new ArrayList<Double>();
if (numParts <= 0) { return result; }
double qty = Math.floor(number / numParts);
for (int i = 0; i < numParts - 1; i++) {
result.add((int)qty);
}
qty = (result.get(1))*(numParts-1);
result.add(number - qty);
return result;
}
而对于numParts >= number的情况,可以加条件:
private List<Double> splitIntoApproxEqualParts(double number, int numParts) {
List<Double> result = new ArrayList<Double>();
if (numParts <= 0) { return result; }
if(numParts >= number){
for( int i =0; 1 < number; i++){
result.add(1);
}
for( int i =0; 1 < numParts - number; i++){
result.add(0);
}
return result;
}
else{
double qty = Math.floor(number / numParts);
for (int i = 0; i < numParts - 1; i++) {
result.add((int)qty);
}
qty = (result.get(1))*(numParts-1);
result.add(number - qty);
return result;
}
}
试一试,行不行就告诉我!
编辑
对不起,我一次简单的计算失败了,但现在可以了
与此处已发布的解决方案相同,但更短:
private List<Double> splitIntoApproxEqualParts(double number, int numParts) {
if (numParts == 0) return Collections.emptyList();
final Double[] result = new Double[numParts];
Arrays.fill(result, Math.floor(number / numParts));
// add remainder to the last number
result[numParts - 1] += number % numParts;
return Arrays.asList(result);
}
好的,所以我有以下问题,最好用一个具体的例子来解释。
给定一个 double、x(比如 100.5)和一个 int y(比如 3),我如何将其分成(大致相等的)部分和 return 包含 33、33 和 34.5 的列表.
我希望列表中的所有元素都是整数(整数),除了最后一个。
当前代码:
private List<Double> splitIntoApproxEqualParts(double number, int numParts) {
List<Double> result = new ArrayList<Double>();
if (numParts <= 0) { return result; }
double qty = Math.floor(number / numParts);
for (int i = 0; i < numParts - 1; i++) {
result.add(qty);
}
result.add(qty + 1);
return result;
}
显然这不适用于 numParts < number 和其他情况。
最优雅的方法是什么?
如何使用
public BigDecimal setScale(int newScale, int roundingMode)
对于所有情况,将比例设置为零并向下舍入。
然后遍历所有并保留 运行 总数,可以 diff'd
并添加到最后一个数字
我认为您几乎有了一个完整的解决方案,为 1 个部分添加一个处理程序,然后使用您现有的 qty
(但从最后一个条目的原始 number
中减去它)。比如,
private static List<Double> splitIntoApproxEqualParts(double number, int numParts) {
if (numParts <= 0) {
return Collections.emptyList();
} else if (numParts == 1) {
return Arrays.asList(number);
}
List<Double> result = new ArrayList<>(numParts);
double qty = Math.floor(number / numParts);
int t = numParts - 1;
IntStream.range(0, t).forEach(x -> result.add(qty));
result.add(number - (qty * t));
return result;
}
我觉得你还差得远,
private List<Double> splitIntoApproxEqualParts(double number, int numParts) {
List<Double> result = new ArrayList<Double>();
if (numParts <= 0) { return result; }
double qty = Math.floor(number / numParts);
for (int i = 0; i < numParts - 1; i++) {
result.add((int)qty);
}
qty = (result.get(1))*(numParts-1);
result.add(number - qty);
return result;
}
而对于numParts >= number的情况,可以加条件:
private List<Double> splitIntoApproxEqualParts(double number, int numParts) {
List<Double> result = new ArrayList<Double>();
if (numParts <= 0) { return result; }
if(numParts >= number){
for( int i =0; 1 < number; i++){
result.add(1);
}
for( int i =0; 1 < numParts - number; i++){
result.add(0);
}
return result;
}
else{
double qty = Math.floor(number / numParts);
for (int i = 0; i < numParts - 1; i++) {
result.add((int)qty);
}
qty = (result.get(1))*(numParts-1);
result.add(number - qty);
return result;
}
}
试一试,行不行就告诉我!
编辑 对不起,我一次简单的计算失败了,但现在可以了
与此处已发布的解决方案相同,但更短:
private List<Double> splitIntoApproxEqualParts(double number, int numParts) {
if (numParts == 0) return Collections.emptyList();
final Double[] result = new Double[numParts];
Arrays.fill(result, Math.floor(number / numParts));
// add remainder to the last number
result[numParts - 1] += number % numParts;
return Arrays.asList(result);
}