2011-07-01 67 views
4

我已經有幾種方法來解決這個問題,但我對是否有更好的解決方案感興趣。請僅以純數字算法迴應。字符串操作是不可接受的。我正在尋找一個優雅高效的解決方案。如何對貨幣值進行湊整

給定貨幣價值(即251.03美元),將該值分成兩半並舍入到小數點後兩位。關鍵是上半場應該輪到上半場,第二輪應該下半場。所以這種情況下的結果應該是125.52美元和125.51美元。

+1

堆棧溢出應該是一個更合適的網站 –

+0

我已經刪除了特定語言的評論。這是一個算法問題。 – kakridge

+0

當你說純數字算法是圓形函數可接受?如果不是什麼關於MOD和ABS?我可以濫用數據類型嗎? –

回答

5

除以二,一輪到2 d.p. (在C#中這是decimal.Round(value, 2)),從原始值中減去四捨五入的值,並使用if對它們進行排序。您的庫可能支持四捨五入的控制,這可以爲您節省if - 使用C#,您可以使用decimal.Round的三參數超載來執行此操作。

1
money = amount_you_are_dividing 
bigmoney = ceiling((money/2) * 100)/100 
littlemoney = money - bigmoney 

這當然假設您可以訪問帶有吊頂功能的數學庫。

0

我假定您代表使用整數(而不是浮點)幣種,使得貨幣值¤123.45由整數v = 12345

表示接着較大部分是(v + 1)/2和較小的部分是v/2

(如果使用浮點數來表示貨幣,見this question。)

0

一些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 ; 
} 
+0

這是很多代碼來嘗試做一件簡單的事情。 – ronalchn