分配具有不同余数的JavaScript编号

时间:2019-02-23 22:09:27

标签: javascript math

想象一下以下情况:数字(10.03)应该由3分配。在普通的JavaScript中,这将分别导致3,3433333333。 我理想中想要的是一种输出包含3个元素的数组的解决方案,该数组包含以下值:

[ 3.34, 3.34, 3.35 ]

我无法解决这个问题。我尝试过的:

const a = 10.03;
const b = 3;
const dist = [];

for (let i = 0; i < b; i++) {
    dist.push((a / b).toFixed(2));
}

输出:

[3.34, 3.34, 3.34]

1 个答案:

答案 0 :(得分:4)

已更新:

这是一个更新的版本,按照@Bergi的建议,可以更均匀地分配其余部分。大小取决于minDecimalPlacesdividend的精度;

编辑:@ Bergi改进了性能

function distributedDivision(dividend, divisor, minDecimalPlaces) {
  const decimalPlaces = Math.max(
    minDecimalPlaces,
    (dividend + '.').toString().split('.')[1].length
  );
  const magnitude = Math.pow(10, decimalPlaces);
  const quotient = Math.floor((dividend * magnitude) / divisor);
  const result = Array(divisor).fill(quotient);
  let i = 0;
  for (
    let remainder = Math.floor((dividend * magnitude) % divisor);
    remainder > 0;
    remainder--
  ) {
    result[i]++;
    i++;
  }
  return result.map(v => Math.round(v) / magnitude);
}

console.log(distributedDivision(10.10, 4, 2));

我假设您想要的是一个除数函数,该函数将商数限制为小数位数?

您可以执行以下操作:

function distributedDivision(dividend, divisor, maxDecimalPlaces) {
  const magnitude = Math.pow(10,maxDecimalPlaces);
  const lesser = Math.round((dividend*magnitude)/divisor)/magnitude;
  return (new Array(divisor-1)).fill(lesser).concat(Math.round((dividend-(lesser*(divisor-1)))*magnitude)/magnitude);
}

console.log(distributedDivision(10.03,3,2));
console.log(distributedDivision(10.04,3,2));
console.log(distributedDivision(10.07,4,2));

编辑:一个要求是,maxDecimalPlaces至少与dividend中的小数位数一样