我正在尝试编写一个给出像
这样的数组的函数var a = [
0.0015974718789698097
,0.755383581038094
,0.13950473043946954
,0.0011978091842754731
,0.005126875727346068
,0.0042250281407886295
,0.0001720958819913952
,0.0047584144830165875
,0.0835073272489086
,0.00016098907002300275
,0.0028037075787230655
,0.0014378579473690483
,0.00012411138102484662
]
或
var a = [
0.33333333333333333
,0.33333333333333333
,0.33333333333333333
]
或
var a = [
0.166666666666666
,0.166666666666666
,0.3
,0.3333333333333333
]
它将每个数字四舍五入到小数点后3位,同时保持所有值的总和仍然等于1.0。
我想象的方法是通过获取新总和与预期总和的差值并分配差异,同时保持相对分布尽可能接近。我只能想到一种迭代方法,并想看看人们可以提出的其他解决方案
重要的是要注意0.00012411138102484662
的最后一个值将舍入到0.000,但这并不意味着它永远不会得到一点差异,因为它想要保持的分布是不连续的分布,而不是在舍入到3位小数之后,也不是在平衡迭代之后的当前分布
答案 0 :(得分:0)
如果您计划将数组中的每个值四舍五入到第三个小数并将它们全部添加,那么这就是您需要做的事情。您需要将数组的每个数字放入循环中,并通过执行.toFixed(3)
将该数字解析为固定的第3个十进制数并将其解析为浮点数并将其添加到将循环的变量,并且变量的值将更改。像这样:
var int = 0;
a.forEach(number => { int += parseFloat(number.toFixed(3)) })
int // 1