2011-09-20 5 views
1

내가 PHP에서 정밀도로 소수점 이하를 버리고 반올림하는 함수, 더 좋은 방법은 무엇입니까?

function round_down($value, $precision = 0) { 
if (!empty($value)) { 
$sign = (0 <= $value) ? +1 : -1; 
$amt = explode('.', $value); 
$precision = (int) $precision; 
if (strlen($amt[1]) > $precision) { 
    $next = (int) substr($amt[1], $precision); 
    $amt[1] = (float) (('.'.substr($amt[1], 0, $precision)) * $sign); 
    if (0 != $next) { 
     if (-1 == $sign) { 
      $amt[1] = $amt[1] - (float) (('.'.str_repeat('0', $precision - 1).'1') * $sign); 
     } 
    } 
} 
else { 
    $amt[1] = (float) (('.'.$amt[1]) * $sign); 
} 
return $amt[0] + $amt[1]; 
} 
else {echo 'error';} 
} 

인 ROUND_UP 부분에 대해 나를 위해 작동 php.net에이 코드 ..

function round_up($value, $precision = 0) { 
if (!empty($value)) { 
$sign = (0 <= $value) ? +1 : -1; 
$amt = explode('.', $value); 
$precision = (int) $precision; 
if (strlen($amt[1]) > $precision) { 
    $next = (int) substr($amt[1], $precision); 
    $amt[1] = (float) (('.'.substr($amt[1], 0, $precision)) * $sign); 
    if (0 != $next) { 
     if (+1 == $sign) { 
      $amt[1] = $amt[1] + (float) (('.'.str_repeat('0', $precision - 1).'1') * $sign); 
     } 
    } 
} 
else { 
    $amt[1] = (float) (('.'.$amt[1]) * $sign); 
} 
return $amt[0] + $amt[1]; 
} 
else {echo 'error';} 
} 

추가 된 몇 마이너스의 .. 얻기 위해이 일을 ... 발견이 어떤 그것을하는 더 좋은 방법? 훨씬 고장없이 작동 대부분의 경우 현재 (난 단지 긍정적 인 소수를 위해 그것을 필요로) ..

$azd = 0.0130; 

$azd1 = number_format(round_up($azd,2),4); 
$azd2 = number_format(round_down($azd,2),4); 
$azd3 = number_format(round_up($azd,1),4); 
$azd4 = number_format(round_down($azd,1),4); 

echo 'Round_up = '.$azd1.'<br>'; // 0.0200 
echo 'Round_down = '.$azd2.'<br>'; // 0.0100 
echo 'Round_up = '.$azd3.'<br>'; // 0.1000 
echo 'Round_down = '.$azd4.'<br>'; // 0.0000 
+3

을 추가 옵션으로 라운드()가 잘 작동 실 거예요? http://php.net/manual/en/function.round.php – EO2

+1

'0.0130'을 반올림하면 0.1이됩니다. 어떤 수학을하고 있니? – NullUserException

+0

@NullUserException 그는 십진수 1의 특정 정밀도까지 값을 반올림합니다. –

답변

5
function round_up($value, $precision=0) { 
    $power = pow(10,$precision); 
    return ceil($value*$power)/$power; 
} 
function round_down($value, $precision=0) { 
    $power = pow(10,$precision); 
    return floor($value*$power)/$power; 
} 
+0

아, 저를 때려 눕히세요! Voted up =] –

1
function round_up($float,$mod) { 
    return ceil($float * pow(10,$mod))/pow(10,$mod); 
} 
function round_down($float,$mod=0) { 
    return floor($float * pow(10,$mod))/pow(10,$mod); 
} 
+1

'$ power' 변수를 전체 표현식으로 바꾼 것을 제외하고는 Kolink의 답과 본질적으로 동일합니다. – NullUserException

+0

자신의 게시물에 대한 내 의견을 보면, 그는 제출할 때 답변했으며 사본이 아니기 때문에 최선의 방법 일뿐입니다. –

+0

나는 그것이 사본이라고 말하지 않았다. 단지 똑같은 대답이다. – NullUserException

관련 문제