如何舍入货币值

时间:2011-07-01 14:03:43

标签: algorithm currency

我已经有几种方法可以解决这个问题,但我对是否有更好的解决方案感兴趣。请仅使用纯数字算法进行响应。字符串操作是不可接受的。我正在寻找一种优雅而有效的解决方案。

给定货币值(即$ 251.03),将值拆分为两半并舍入到两位小数。关键是上半部分应该向上,第二部分应该向下舍入。因此,这种情况下的结果应该是125.52美元和125.51美元。

4 个答案:

答案 0 :(得分:5)

除以2,圆到2 d.p. (在C#中这是decimal.Round(value, 2)),从原始值中减去舍入值,并使用if对它们进行排序。您的库可能支持控制舍入,这可以为您节省if - 使用C#,您可以使用decimal.Round的3参数重载执行此操作。

答案 1 :(得分:1)

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

这当然假设您可以访问具有天花板功能的数学库。

答案 2 :(得分:0)

我假设您使用整数(而非浮点)表示货币,因此货币值¤123.45由整数v = 12345表示。

然后较大的部分是(v + 1) / 2,较小的部分是v / 2

(如果您使用浮点数表示货币,请参阅this question。)

答案 3 :(得分:0)

一些用于舍入货币值的PHP逻辑 到指定的金额。 (Penny,镍,一角,四分之一,50c,美元。)

调用语句将原始值作为第一个参数传递,并将舍入单位(。05,。10,。25,。50,1.00)作为第二个参数传递。

e.g。

$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 ;
}