Javascript 将数字数组平衡为等于1

Javascript 将数字数组平衡为等于1,javascript,Javascript,我正在尝试编写一个函数,该函数给定一个数组,如 var a = [ 0.0015974718789698097 ,0.755383581038094 ,0.13950473043946954 ,0.0011978091842754731 ,0.005126875727346068 ,0.0042250281407886295 ,0.0001720958819913952 ,0.0047584144830165875 ,0.0

我正在尝试编写一个函数,该函数给定一个数组,如

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
]

它将每个数字四舍五入到小数点后3位,同时保持所有值的总和仍然等于1.0

我想象它会这样做的方式是,取新的和和预期的和的差值,然后分配差值,同时尽可能保持相对分布。我只能想到一种迭代方法,并想看看人们能想出什么其他解决方案


需要注意的是,
0.0001241138102484662
的最后一个值将舍入到0.000,但这并不意味着它永远不会得到一部分差异,因为它想要保持的分布是未舍入的分布,不是四舍五入到小数点后3位后的当前分布,也不是平衡迭代后的当前分布如果您计划将数组中的每个值四舍五入到小数点后3位,然后将它们全部相加,则需要执行以下操作。您需要将数组中的每个数字放入一个循环中,并通过执行
.toFixed(3)
并将其解析为一个浮点,然后将其添加到一个变量中,该变量将循环,变量的值将改变,从而将该数设为固定的第三位小数。这样地:


“四舍五入到小数点后三位”在二进制浮点数的世界里没有真正的意义,“和”在浮点数方面甚至没有很好的定义。为了给你一个想法,
a.reduce(函数(p,c){return p+c},0)
给我
1.0000000000000002
而不是
1
。如果以不同的顺序进行总结,这可能会有所不同。这些警告是问题的一部分-我希望,如果最终结果的精度仅为小数点后3位,则可以忽略浮点错误。“这就是我提出的,寻求改进或潜在错误”听起来像是您的预期工作?如果是这样的话,这个问题听起来像是一个很好的候选人。堆栈溢出对于有多个(同样有效)答案的开放式问题来说不是一个好地方。要求移动它时,我本来没有代码,但决定自己尝试
var a = [
    0.33333333333333333
    ,0.33333333333333333
    ,0.33333333333333333
]
var a = [
    0.166666666666666
    ,0.166666666666666
    ,0.3
    ,0.3333333333333333
]
var int = 0;
a.forEach(number => { int += parseFloat(number.toFixed(3)) })
int // 1