将数组“分配/缩放”给定值的数量

问题描述 投票:0回答:1

我正在一个项目中,我需要分配一个数组的值,并且这些值的总和必须为100。

示例:

  • [70, 34, 92]和总值100。输出为[35.71, 17.35, 46.94],因为35.71 + 17.35 + 46.94 = 100
  • [86, 99.5, 100]和总值100。输出为[30.12, 34.85, 35.03]
  • [96, 37]和总值100。输出为[72.18, 27.82]
  • [98, 76.5, 68.5, 63.5, 38.5]和总值100。输出为[28.41, 22.17, 19.86, 18.41, 11.15] = 100(sum)。

到目前为止我的解决方案:

  • 求和给定数组中的所有值
  • 每个值乘以100
  • 将每个值除以总和
  • 使用.toFixed(2)

“公式/计算”:+(((valueOfArray * 100) / totalSumOfGivenArray).toFixed(2))

我的第一个解决方案(有小数点的问题,所以不可接受):

prioritySum  = 0;
controlsKey.forEach((value) => {
      priorityVal = this.getDistributedValue(+form.controls[formId].value, totalCatSum); // return +(((valueOfArray * 100) / totalSumOfGivenArray).toFixed(2))
      prioritySum = prioritySum + priorityVal;
});

此解决方案有时不能完全返回100值。输出各种内容,例如99.99、99.999999、100(大部分),100.0000000001、99.999978、100.09999999、99.000009。这里有一些十进制数字的问题。

我使用的另一种方法是:

let i = 0;
for(i = 0;  i < controlsKey.length-1; i++){
  let formId = controlsKey[i];
  relValue = this.getDistributedValue(+form.controls[formId].value, totalActualSum); // returns formula result
  form.controls[formId].setValue(relValue))
  relativeSum = relativeSum + relValue;
}
relValue = 100 - relativeSum;
form.controls[controlsKey[i]].setValue(relValue)

这很好,但是这个解决方案嗯...

所以我的问题是这个问题有什么优雅的解决方案吗?

第一个解决方案对我来说还可以,但即使使用.toFixed(2),小数点也存在一些问题>

[我正在一个项目中,我需要分配一个数组的值,并且这些值的总和必须为100。例如:[70,34,92],总值为100。输出为[35.71, 17.35,...

javascript arrays typescript decimal scale
1个回答
1
投票

为了防止使用不需要的浮点值,可以使用整数值,并从10000的基值中减去该值,并创建一个字符串数组,在该数组中将点插入到要获取格式化字符串的值中。


0
投票

所以最大的问题是浮点数固有的不准确性。如果您

© www.soinside.com 2019 - 2024. All rights reserved.