2
我試圖寫該給定像號碼的餘額陣列等於1
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,但這並不意味着它不應該得到一個區別,因爲它想要維護的分佈是未分佈的分佈,而不是四捨五入到小數點後三位的當前分佈,也不是平衡迭代後
「輪到小數點後三位」並沒有真正在二進制浮點的世界意義。 – Pointy
「總和」在浮點方面甚至沒有明確定義。給你一個想法,'a.reduce(function(p,c){return p + c},0)'給我'1.0000000000000002'而不是'1'。如果以不同的順序總結,這可能是不同的。 – Siguza
這些警告是問題的一部分 - 我的希望是浮點錯誤可以忽略,如果最終結果將只有3位小數的精度 – LearningJrDev