Как округлить валютные значения - PullRequest
4 голосов
/ 01 июля 2011

У меня уже есть несколько способов решить эту проблему, но меня интересует, есть ли лучшее решение этой проблемы.Пожалуйста, отвечайте только с чистым числовым алгоритмом.Манипуляции со строками недопустимы.Я ищу элегантное и эффективное решение.

Учитывая стоимость валюты (т.е. $ 251,03), разделите значение на две половины и округлите до двух десятичных знаков.Ключ в том, что первая половина должна округляться вверх, а вторая - вниз.Таким образом, результат в этом сценарии должен составить 125,52 доллара и 125,51 доллара.

Ответы [ 4 ]

5 голосов
/ 01 июля 2011

Разделите на два, округлите до 2 д.п. (в C # это decimal.Round(value, 2)), вычтите округленное значение из оригинала и сортируйте их, используя if. Ваша библиотека может поддерживать контроль над округлением, что может спасти вас, если - с C # вы можете сделать это, используя перегрузку с 3 параметрами decimal.Round.

1 голос
/ 01 июля 2011
money = amount_you_are_dividing
bigmoney = ceiling((money / 2) * 100)/100
littlemoney = money - bigmoney

Это, конечно, предполагает, что у вас есть доступ к математической библиотеке с функцией потолка.

0 голосов
/ 17 сентября 2012

Некоторая логика php для округления валютных значений до указанной суммы. (Пенни, никель, десять центов, квартал, 50 центов, доллар.)

Вызывающий оператор передает исходное значение в качестве первого аргумента, а единицу округления (.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 голосов
/ 01 июля 2011

Я предполагаю, что вы представляете свою валюту с помощью целых чисел (а не с плавающей запятой), поэтому значение валюты ¤123,45 представляется целым числом v = 12345.

Тогда большая часть равна (v + 1) / 2, а меньшая часть - v / 2.

(Если вы используете числа с плавающей точкой для представления валюты, см. этот вопрос .)

...