在 JavaScript 中,给定 (x) 个这样的分数:
0.3
0.3
0.2
0.1
0.1
(总和为 1)
我如何确保当我将这些乘以一个数字 (n),比如 1000,并将结果四舍五入为整数时,这些整数的总和将等于 (n)?
在 JavaScript 中,给定 (x) 个这样的分数:
0.3
0.3
0.2
0.1
0.1
(总和为 1)
我如何确保当我将这些乘以一个数字 (n),比如 1000,并将结果四舍五入为整数时,这些整数的总和将等于 (n)?
使用最大余数法:
第 1 步:将数字乘以n
(在这种情况下,让我们使用一个n
不能立即很好地计算出来的数字来证明 LRM 仍然有效;我选择 737),然后将整数部分和小数部分分开。
0.3 * 737 = 221 + 0.1
0.3 * 737 = 221 + 0.1
0.2 * 737 = 147 + 0.4
0.1 * 737 = 73 + 0.7
0.1 * 737 = 73 + 0.7
第 2 步:总结整数部分
221 + 221 + 147 + 73 + 73 = 735
第三步:将余数从高到低排序
High to low: 0.7, 0.7, 0.4, 0.1, 0.1
第 4 步:将1
具有关联最大余数的整数分量相加,直到总和等于n
。
在我们的例子中,我们距离目标总和 ( 737
) 2,并且0.7
是最大的余数,它出现了两次。0.7
与 相关联,因此在的整数0.1
上加 1 。0.1
您的最终清单是:
221
221
147
74
74
如果你乘法、四舍五入和求和,你不能保证它。为什么不先求和,再乘,再取整?