2014-04-10 6 views
0

일부 숫자를 서로 백분율로 변환하고 싶습니다. 다음 코드는 몇 번이나 작동하지만 너무 자주 소수점 자리를 벗어납니다.PHP : 숫자를 백분율로 변환

문제는 round(); 기능입니다. 아래의 예에서 백분율 값이 100.01에 추가되는 것을 볼 수 있습니다. 이것은 내 파이 차트를 어지럽 힙니다. :(

어떻게이 문제를 해결할 수 있습니다 그래서 함께 추가 할 때 해당 백분율 값은 항상 100 명중합니다

$total['one']['value'] = '158'; 
$total['two']['value'] = '129'; 
$total['three']['value'] = '121'; 

$total['all'] = $total['one']['value'] + $total['two']['value'] + $total['three']['value']; 

$total['one']['percent'] = round(($total['one']['value']/$total['all']) * 100, 2); 
$total['two']['percent'] = round(($total['two']['value']/$total['all']) * 100, 2); 
$total['three']['percent'] = round(($total['three']['value']/$total['all']) * 100, 2); 

반환 값 :?. OP에서 $total

Array 
(
    [one] => Array 
     (
      [value] => 158 
      [percent] => 38.73 
     ) 

    [two] => Array 
     (
      [value] => 129 
      [percent] => 31.62 
     ) 

    [three] => Array 
     (
      [value] => 121 
      [percent] => 29.66 
     ) 

    [all] => 408 
) 
+0

항상 정확히 3 개의 값이 있습니까? – Mooseman

+0

네,하지만 어떤 금액으로도 사용할 수 있어야한다고 생각합니다. – ditto

+0

[부동 소수점 연산이 깨졌습니까?] (http://stackoverflow.com/questions/588004/is-floating-point-math-broken) –

답변

1
$total['three']['percent'] = 100-($total['one']['percent']+$total['two']['percent']); 
if($total['three']['percent'] < 0 && $total['two']['percent'] > 0-$total['three']['percent']){ 
    $total['two']['percent'] += $total['three']['percent']; 
    $total['three']['percent'] = 0; 
}else if($total['three']['percent'] < 0){ 
    $total['one']['percent'] += $total['three']['percent']; 
    $total['three']['percent'] = 0; 
} 

데모 : http://codepad.org/ydzpbHZr
precent의 값이 다른 추가 데모 : http://codepad.org/A9aUgniAhttp://codepad.org/1bDaH4TX.

관련 문제