我已經有幾種方法來解決這個問題,但我對是否有更好的解決方案感興趣。請僅以純數字算法迴應。字符串操作是不可接受的。我正在尋找一個優雅高效的解決方案。如何對貨幣值進行湊整
給定貨幣價值(即251.03美元),將該值分成兩半並舍入到小數點後兩位。關鍵是上半場應該輪到上半場,第二輪應該下半場。所以這種情況下的結果應該是125.52美元和125.51美元。
我已經有幾種方法來解決這個問題,但我對是否有更好的解決方案感興趣。請僅以純數字算法迴應。字符串操作是不可接受的。我正在尋找一個優雅高效的解決方案。如何對貨幣值進行湊整
給定貨幣價值(即251.03美元),將該值分成兩半並舍入到小數點後兩位。關鍵是上半場應該輪到上半場,第二輪應該下半場。所以這種情況下的結果應該是125.52美元和125.51美元。
除以二,一輪到2 d.p. (在C#中這是decimal.Round(value, 2)
),從原始值中減去四捨五入的值,並使用if對它們進行排序。您的庫可能支持四捨五入的控制,這可以爲您節省if - 使用C#,您可以使用decimal.Round
的三參數超載來執行此操作。
money = amount_you_are_dividing
bigmoney = ceiling((money/2) * 100)/100
littlemoney = money - bigmoney
這當然假設您可以訪問帶有吊頂功能的數學庫。
我假定您代表使用整數(而不是浮點)幣種,使得貨幣值¤123.45由整數v
= 12345
表示接着較大部分是(v + 1)/2
和較小的部分是v/2
。
(如果使用浮點數來表示貨幣,見this question。)
一些PHP邏輯到輪貨幣值 到指定的量。 (Penny,nickel,dime,quarter,50c,dollar。)
調用語句將原始值作爲第一個參數,舍入單位(.05,.10,.25,.50,1.00)作爲第二。
例如
$price = invtround{$value, .10} ;
該函數返回四捨五入的值。
function invtround($x,$y)
{
if ($x == 0.01) {
$result = $y ;
}
if ($x == .05) {
$floor = round($y,1) ;
if ($floor > $y) {$floor = $floor - $x ;}
$diff = $y - $floor ;
if ($diff < .03) {$result = $floor ;}
else if ($diff < .08) {$result = $floor + .05;}
else {$result = $floor + .10;}
}
if ($x == .10) {
$floor = round(floor($y*10)/10,1) ;
if ($floor > $y) {$floor = $floor - $x ;}
$diff = $y - $floor ;
if ($diff < .05) {$result = $floor ;}
else {$result = $floor + .10;}
}
if ($x == .25) {
$floor = floor($y*10)/10 ;
$diff = $y - $floor ;
if ($diff < .13) {$result = $floor ;}
else if ($diff < .38) {$result = $floor +.25;}
else if ($diff < .68) {$result = $floor + .50;}
else if ($diff < .88) {$result = $floor + .75;}
else {$result = $floor + 1.0;}
}
if ($x == .50) {
$floor = floor($y*10)/10 ;
$diff = $y - $floor ;
if ($diff < .25) {$result = $floor ;}
else if ($diff < .75) {$result = $floor + .50;}
else {$result = $floor + 1.0;}
}
if ($x == 1.00){$result = round($y,0) ;}
$result = number_format($result,2);
return $result ;
}
這是很多代碼來嘗試做一件簡單的事情。 – ronalchn
堆棧溢出應該是一個更合適的網站 –
我已經刪除了特定語言的評論。這是一個算法問題。 – kakridge
當你說純數字算法是圓形函數可接受?如果不是什麼關於MOD和ABS?我可以濫用數據類型嗎? –