Yuvarlama işlemleri için;
ceil() -> tavan, Yukarı yuvarlar
floor() -> taban, Aşağı yuvarlar
round() -> Virgül sonrası 5 den küçükse aşağı, büyük ise yukarı yuvarlar.
Peki belirli bir katsayıya göre aşağı ve yukarı yuvarlamasını istersek nasıl bir yol izlememiz gerekir?
Bunun için “fmod” fonksiyonundan yararlanabiliriz. fmod, belirtilen 2 rakam arasında, ilk rakamı, ikinci rakama böler ve kalanı verir.
Kısaca 34 değerini, 3’ün katlarında yuvarlamak için;
34/3 (Değer/Katsayı) = 1,3333..., Kalan = 1; Değer-Kalan -> Aşağı yuvarlar, 34-1=33. Değer+(Katsayı-Kalan) -> Yukarı yuvarlar, 34+(3-1) = 36
Aşağıdaki fonksiyon, fmod fonksiyonu yardımıyla, belirttiğimiz sayının katlarına göre, hem yukarı(ceil), hem de aşağı(floor) yuvarlamaktadır. Eğer sayımız, belirtilen katsayıya uygun ise, yukarı ve aşağı yuvarlama değeri olduğu gibi geri dönecektir.
//Kullanımı
$sayi = 34;
$katsayi = 3;
$sonuc = yuvarla($sayi, $katsayi);
print_r($sonuc);
/*
Array ( [ceil] => 36 [floor] => 33 [degerler] => 34,3 [fmod] => 1 [error] => )
*/
Fonksiyon
//------------------------------------------
// Katsayılı Yuvarla - coefficient rounding
//------------------------------------------
/**
* Returns ceil(tavan), floor(zemin), values, error
* @return array
*/
function yuvarla($deger, $katsayi) {
$return = array('ceil' => 0, 'floor' => 0, 'degerler' => $deger.','.$katsayi, 'fmod' => '', 'error' => '');
$error = array();
if (!is_numeric($deger)) {
$error[] = 'İlk değer rakam olmalı.';
}
if (!is_numeric($katsayi)) {
$error[] = 'Katsayı rakam olmalı';
}
if ($deger == 0 AND $katsayi == 0) {
$error[] = 'Değerler Sıfır';
}
elseif ($deger == 0) {
$error[] = 'Değer Sıfır';
}
elseif ($katsayi == 0) {
$error[] = 'Katsayı Sıfır';
}
if ($error) {
$err = '';
foreach ($error as $ev) {
$err .= $ev."\n";
}
$return['error']= nl2br(trim($err));
$return['ceil'] = false;
$return['floor'] = false;
}
else {
$fark = fmod($deger, $katsayi); // ex: fmod(8,3) => 2;
$return['fmod'] = $fark;
$return['ceil'] = $fark ? ($deger - $fark)+$katsayi : $deger;
$return['floor'] = $fark ? $deger - $fark : $deger;
}
return $return;
}