2016-12-30 33 views
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,但這並不意味着它不應該得到一個區別,因爲它想要維護的分佈是未分佈的分佈,而不是四捨五入到小數點後三位的當前分佈,也不是平衡迭代後

+2

「輪到小數點後三位」並沒有真正在二進制浮點的世界意義。 – Pointy

+0

「總和」在浮點方面甚至沒有明確定義。給你一個想法,'a.reduce(function(p,c){return p + c},0)'給我'1.0000000000000002'而不是'1'。如果以不同的順序總結,這可能是不同的。 – Siguza

+0

這些警告是問題的一部分 - 我的希望是浮點錯誤可以忽略,如果最終結果將只有3位小數的精度 – LearningJrDev

回答

0

如果您計劃對數組中的每個值進行四捨五入到小數點後第三位並加起來,然後這就是你需要做的。您需要將數組的每個數字轉換爲一個循環,然後通過執行.toFixed(3)並將其解析爲一個浮點數並將其添加到一個將循環的變量並將該變量的值更改,從而將該數字設置爲固定的第三個小數點。就像這樣:

var int = 0; 
a.forEach(number => { int += parseFloat(number.toFixed(3)) }) 
int // 1