2016-03-31 25 views
1

Ich arbeite an einer Excel-Formel zu PHP-Funktion konvertieren. Jetzt stehe ich vor einem Problem, das sich als Fraktion aufrundet. Bitte lassen Sie es mich erklären:Aufrundung nach Bruch in PHP

  • (2 * 18) /2.98 = 12,08, aber nach meiner Anforderung sollte es 12,25
    • (2 * 18,5) /2.98 = 12,416, aber nach meiner Anforderung sollte es 12,50
    • (2 * 18,8) /2.98 = 12,617, aber nach meiner Anforderung sollte es 12,75
sein

  • Decke ((2 * 18) /2.98, 0,25) = 12,25
    • Decke ((2 * 18,5) /2.98, 0,25) =:

      in Excel, ist es wie getan 12.50

    • Decke ((2 * 18,8) /2.98, 0,25) = 12,75

Ich habe es in PHP versucht. Ceil() und Floor() dienen nicht dem Zweck, da diese den Output 13 und 12 entsprechend ergeben.

Eine andere Runde() verwendet diese Optionen PHP_ROUND_HALF_UP, PHP_ROUND_HALF_DOWN, PHP_ROUND_HALF_EVEN, or PHP_ROUND_HALF_ODD, die den Zweck nicht erfüllt.

Wer kann mir helfen?

+4

Diese Frage wurde hier beantwortet: http://stackoverflow.com/questions/14903379/rounding-to-nearest-fraction-half-quarter-etc – Andreas

+0

@andreas danke für Ihre Informationen. Es hilft auch. – naf4me

+0

@ketan was hast du bearbeitet? – naf4me

Antwort

1

Verwendung dieser Funktion:

function fractionRound($num,$frac) { 
    return ceil($num/$frac)*$frac; 
} 

es nennt diese Art und Weise:

echo fractionRound((2 * 18)/2.98, 0.25); 

es rund auf die nächsten 0,25 wird es zurückgeben 12,25

0

PHP bietet nur die Möglichkeit, auf eine Genauigkeit zu runden, mit den Optionen, die Sie gefunden haben. Mit etwas erfinderischer Mathematik und einer Userland-Funktion können Sie jedoch etwas Ähnliches machen.

Versuchen:

function roundTo($value, $roundTo = 1) 
{ 
    $inverse = 1/$roundTo; 
    return round($value * $inverse)/$inverse; 
} 

See: https://ideone.com/fojMrS

Beachten Sie, dass, wenn Sie die ceil oder floor Funktionalität möchten, müssen Sie Versionen dieser Funktion für ceil und floor schaffen müssen, ist dies nur für round .

+0

es funktioniert nicht für alle Werte. – naf4me

-2

Entschuldigung, falsch gelesen.

Versuchen Sie folgendes:

Short Way

function ceil_quarter($a) { 
    return number_format(ceil($a * 4)/4, 2); 
} 

Long Way

function ceil_quarter($a) { 
    return number_format(floor($a) . '.' . (ceil(((int)substr(number_format($a - floor($a), 2), 2))/25) * 25), 2); 
} 

$a = (2 * 18)/2.98; 
echo ceil_quarter($a); 

12.25;

echo ceil_quarter(10.0555555); 

10,25

echo ceil_quarter(4); 

4,00

+0

Das ist nicht was er verlangt. In seinem Fall will er 10,25, wenn die Eingabe 10,05555 – Andreas

+1

Edited ist. Musste nur noch eine Rundung mit dem number_format machen. – Brogan

0
$YourNumber = 12.08; 
$int = $YourNumber * 4; 
$int = ceil($int); 

echo $YourNumber ." was the start <br>"; 
echo $int/4 ." is the answer"; 
0
function roundQuarters($input) 
{ 
    $rm = $input % 0.25; 
    return $rm == 0 ? $input : $input - $rm + 0.25; 
} 

Diese das Dezimalsystem auf den nächsten 0,25 abrunden wird, wenn es ist auch ein Teiler von 0,25, es wird dasselbe zurückgeben. Einfach.

Und Sie können 0.25 bis zu welcher Dezimalzahl Sie ersetzen oder sogar das parametrieren.