PHP Katsayılı Yuvarlama Fonksiyonu

Katsayılı Yuvarlama Fonksiyonu – Coefficient Rounding Function

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;
}

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir