如何将货币值四舍五入

5
我已经有几种解决方法,但我想知道是否有更好的解决方案。请仅使用纯数字算法进行回复。不接受字符串操作。我正在寻找一种优雅高效的解决方案。
给定一个货币价值(例如$251.03),将该价值分为两半并四舍五入到小数点后两位。关键是第一半应该向上舍入,第二半应该向下舍入。因此,在这种情况下的结果应该是$125.52和$125.51。

1
堆栈溢出(Stack Overflow)可能是一个更合适的网站。 - Tom Squires
我已经删除了特定语言的注释。这是一个算法问题。 - kakridge
当你说纯数值算法时,像舍入函数这样的东西是可以接受的吗?如果不行,那么 MOD 和 ABS 呢?我可以滥用数据类型吗? - Jon Hopkins
是的,round、mod、abs等都可以。任何通常会出现在数学库中的内容都可以。 - kakridge
你不应该使用(二进制)浮点数来表示十进制货币值 - 这样会出错。使用整数(以分为单位)或某些十进制数字类型(取决于您的语言/库)。然后舍入就变得容易了。 - Paŭlo Ebermann
4个回答

5

将数值除以二,保留两位小数(在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

一些 PHP 逻辑,用于将货币值舍入到指定金额(分,镍币,一角硬币,25 美分硬币,50 美分硬币,1 美元)。

调用语句将原始值作为第一个参数传递,将舍入单位(.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

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接