Распределить номер JavaScript с переменным остатком - PullRequest
0 голосов
/ 24 февраля 2019

Представьте себе следующий случай: число (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 голосов
/ 24 февраля 2019

Обновлено:

Вот более новая версия, которая распределяет остаток более равномерно, как предложено @Bergi.Величина зависит от большего minDecimalPlaces или точности dividend;

РЕДАКТИРОВАТЬ : улучшена для производительности @ 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...