JavaScript - 将 3 个数字转换为百分比,总计不是 100%
JavaScript - converting 3 numbers to percentage, doesn't yield 100% total
我有一个场景,我有三个数字:
- 17
- 10
- 90
我需要将它们转换为整数百分比值(以便在添加时合计为 100%,如您所料)。我有这个功能:
function roundPercentageTotals(num1, num2, num3) {
var total = num1 + num2 + num3; // 117
var num1Total = (num1 / total) * 100; // 14.529914529914531
var num2Total = (num2 / total) * 100; // 8.547008547008546
var num3Total = (num3 / total) * 100; // 76.92307692307693
var num1ToDecimal = num1Total.toFixed(1); // 14.5
var num2ToDecimal = num2Total.toFixed(1); // 8.5
var num3ToDecimal = num3Total.toFixed(1); // 76.9
var totalPercentage = parseInt(num1ToDecimal) + parseInt(num2ToDecimal) + parseInt(num3ToDecimal); // 98
return { percentage1: Math.round(num1ToDecimal, percentage2: Math.round(num2ToDecimal), percentage3: Math.round(num3ToDecimal) };
}
在我的示例中,计算的总百分比为 98%。紧随其后:
- 百分比 1 = 15
- 百分比 2 = 9
- 百分比 3 = 77
加起来是 101%,我错在哪里了?
提前感谢您的帮助!
您在第一次计算中得到 98%,因为您将值四舍五入 ,然后在第二次计算中得到 101%,因为您四舍五入它们 向上.
将您的 parseInt()
更改为 parseFloat()
以使您的总数接近 100% 而不是 98%。 parseInt()
楼层小数,不四舍五入。
关于您的第二次计算总计 101%:将 14.5 向上舍入为 15,将 8.5 向上舍入为 9,您刚刚增加了整整 1%。这使您得到 101% 而不是 100%。
最重要的是,如果您要对精确值进行四舍五入,您就无法始终如一地达到 100%,除非您捏造百分比以适应整个过程中的某个位置。
您无法将这些数字转换为不带小数的百分比。它只有在数字除以 100 时才有效。所以这里的答案必须是 (1. 14.5 , 2. 8.5 , 3. 76.9)。正如您所看到的,由于与您抛出的小数相同的原因(即通过将 14.529914529914531 转换为 14.5),缺少“0.1”百分比。
好的,从数学上看,我无法完全实现我所寻找的。但是,我需要对数字进行四舍五入,使其最终等于 100%(所有数字都经过四舍五入,因此并不完全准确)。
这是我的解决方案,以防万一这对其他人有用:
function roundPercentageTotals(numArr) {
// Total of all numbers passed.
var total = numArr[0] + numArr[1] + numArr[2];
// Percentage representations of each number (out of 100).
var num1Percent = Math.round((numArr[0] / total) * 100);
var num2Percent = Math.round((numArr[1] / total) * 100);
var num3Percent = Math.round((numArr[2] / total) * 100);
// Total percent of the 3 numbers combined (doesnt always equal 100%).
var totalPercentage = num1Percent + num2Percent + num3Percent;
// If not 100%, then we need to work around it by subtracting from the largest number (not as accurate but works out).
if (totalPercentage != 100) {
// Get the index of the largest number in the array.
var index = getLargestNumInArrayIndex(numArr);
// Take the difference away from the largest number.
numArr[index] = numArr[index] - (totalPercentage - 100);
// Re-run this method recursively, until we get a total percentage of 100%.
return roundPercentageTotals(numArr);
}
// Return the percentage version of the array passed in.
return [num1Percent, num2Percent, num3Percent];
}
function getLargestNumInArrayIndex(array) {
return array.indexOf(Math.max.apply(Math, array));
}
将一组数字传递给 roundPercentageTotals,例如 roundPercentageTotals([13,54,38]),它将 return 数组中的整个百分比(或我应该说的最接近的百分比)数字。
percent-round 就是这样做的。为我完成了工作。
只需传递值并返回始终加起来为 100% 的百分比。
const percentRound = require ('percent-round');
percentRound([16, 56, 18]); // [18, 62, 20]
我有一个场景,我有三个数字:
- 17
- 10
- 90
我需要将它们转换为整数百分比值(以便在添加时合计为 100%,如您所料)。我有这个功能:
function roundPercentageTotals(num1, num2, num3) {
var total = num1 + num2 + num3; // 117
var num1Total = (num1 / total) * 100; // 14.529914529914531
var num2Total = (num2 / total) * 100; // 8.547008547008546
var num3Total = (num3 / total) * 100; // 76.92307692307693
var num1ToDecimal = num1Total.toFixed(1); // 14.5
var num2ToDecimal = num2Total.toFixed(1); // 8.5
var num3ToDecimal = num3Total.toFixed(1); // 76.9
var totalPercentage = parseInt(num1ToDecimal) + parseInt(num2ToDecimal) + parseInt(num3ToDecimal); // 98
return { percentage1: Math.round(num1ToDecimal, percentage2: Math.round(num2ToDecimal), percentage3: Math.round(num3ToDecimal) };
}
在我的示例中,计算的总百分比为 98%。紧随其后:
- 百分比 1 = 15
- 百分比 2 = 9
- 百分比 3 = 77
加起来是 101%,我错在哪里了?
提前感谢您的帮助!
您在第一次计算中得到 98%,因为您将值四舍五入 ,然后在第二次计算中得到 101%,因为您四舍五入它们 向上.
将您的 parseInt()
更改为 parseFloat()
以使您的总数接近 100% 而不是 98%。 parseInt()
楼层小数,不四舍五入。
关于您的第二次计算总计 101%:将 14.5 向上舍入为 15,将 8.5 向上舍入为 9,您刚刚增加了整整 1%。这使您得到 101% 而不是 100%。
最重要的是,如果您要对精确值进行四舍五入,您就无法始终如一地达到 100%,除非您捏造百分比以适应整个过程中的某个位置。
您无法将这些数字转换为不带小数的百分比。它只有在数字除以 100 时才有效。所以这里的答案必须是 (1. 14.5 , 2. 8.5 , 3. 76.9)。正如您所看到的,由于与您抛出的小数相同的原因(即通过将 14.529914529914531 转换为 14.5),缺少“0.1”百分比。
好的,从数学上看,我无法完全实现我所寻找的。但是,我需要对数字进行四舍五入,使其最终等于 100%(所有数字都经过四舍五入,因此并不完全准确)。
这是我的解决方案,以防万一这对其他人有用:
function roundPercentageTotals(numArr) {
// Total of all numbers passed.
var total = numArr[0] + numArr[1] + numArr[2];
// Percentage representations of each number (out of 100).
var num1Percent = Math.round((numArr[0] / total) * 100);
var num2Percent = Math.round((numArr[1] / total) * 100);
var num3Percent = Math.round((numArr[2] / total) * 100);
// Total percent of the 3 numbers combined (doesnt always equal 100%).
var totalPercentage = num1Percent + num2Percent + num3Percent;
// If not 100%, then we need to work around it by subtracting from the largest number (not as accurate but works out).
if (totalPercentage != 100) {
// Get the index of the largest number in the array.
var index = getLargestNumInArrayIndex(numArr);
// Take the difference away from the largest number.
numArr[index] = numArr[index] - (totalPercentage - 100);
// Re-run this method recursively, until we get a total percentage of 100%.
return roundPercentageTotals(numArr);
}
// Return the percentage version of the array passed in.
return [num1Percent, num2Percent, num3Percent];
}
function getLargestNumInArrayIndex(array) {
return array.indexOf(Math.max.apply(Math, array));
}
将一组数字传递给 roundPercentageTotals,例如 roundPercentageTotals([13,54,38]),它将 return 数组中的整个百分比(或我应该说的最接近的百分比)数字。
percent-round 就是这样做的。为我完成了工作。 只需传递值并返回始终加起来为 100% 的百分比。
const percentRound = require ('percent-round');
percentRound([16, 56, 18]); // [18, 62, 20]