我已经有几种方法可以解决这个问题,但我对是否有更好的解决方案感兴趣。请仅使用纯数字算法进行响应。字符串操作是不可接受的。我正在寻找一种优雅而有效的解决方案。
给定货币值(即$ 251.03),将值拆分为两半并舍入到两位小数。关键是上半部分应该向上,第二部分应该向下舍入。因此,这种情况下的结果应该是125.52美元和125.51美元。
答案 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 ;
}