Bir sayının tam ve ondalık kısmı nasıl elde edilir?


99

Verilirse, diyelim ki 1.25 - bu sayının "1" ve "25" kısımlarını nasıl elde ederim?

Ondalık kısmın 0,0, 0,25, 0,5 veya 0,75 olup olmadığını kontrol etmem gerekiyor.


Basit bir patlama işi olur mu? $ splitDec = patlat (".", $ ondalık); $ splitDec [0] şimdi 1 ile olacak ve splitDec [1] şimdi örneğinizden 25 olacak.
Matt

@Matt split()kullanımdan kaldırıldı.
alex

@alex evet, unuttum. JavaScript düşünüyordum. patlayacak şekilde değiştirildi.
Matt

@Matt, split PHP 5.3'ten itibaren kullanımdan kaldırılmıştır ve aslında argümanı olarak bir normal ifadeyi alır, oysa explode bir dizge alır. Bu durumda explode () tercih edilir.
sığınak

4
Unutmayın explode(".",1.10);1 ve 1 değil, 1 ve 10 vermek wil
Michel

Yanıtlar:


178
$n = 1.25;
$whole = floor($n);      // 1
$fraction = $n - $whole; // .25

Ardından 1/4, 1/2, 3/4 vb. İle karşılaştırın.


Negatif sayı durumunda şunu kullanın:

function NumberBreakdown($number, $returnUnsigned = false)
{
  $negative = 1;
  if ($number < 0)
  {
    $negative = -1;
    $number *= -1;
  }

  if ($returnUnsigned){
    return array(
      floor($number),
      ($number - floor($number))
    );
  }

  return array(
    floor($number) * $negative,
    ($number - floor($number)) * $negative
  );
}

$returnUnsignedYapmaktan durdurur -1,25 için -1 - -0.25


7
Yan olarak intval()veya (int)daha performanslı olabileceği gibi basit bir oyuncu floor()
seçimi

1
Zemin negatifleri nasıl açıklar?
LanceH

@LanceH: Öyle değil, ancak olumsuz bir bayrakla oldukça kolay bir şekilde halledebilirsiniz.
Brad Christie

4
Bir tur () eklemediğiniz sürece bu cevap aslında yanlıştır. Kulağa aptalca geliyor, biliyorum, ama bunun düşük seviyeli kayan noktalı sayı aritmetiği ile ilgisi var. Buraya bakın: stackoverflow.com/questions/3726721/php-math-precision
Matt James

510.9 ile deneyin, 0.89 döndürür. Ama nedenini söyleyemem.
T30

38

Bu kod, onu sizin için böler:

list($whole, $decimal) = explode('.', $your_number);

$ tam tam sayıdır ve $ ondalık ondalık noktadan sonra rakamlara sahip olacaktır.


9
Unutmayın explode(".",1.10);1 ve 1 değil, 1 ve 10 vermek wil
Michel

3
Bu, sayı tamsayı ise veya ondalık kısım içermiyorsa, tanımlanmamış indeks hakkında uyarı verir ve keser.
Andreyco

1
Bu, diziye dönüştürüldüğünde sayının bilimsel gösterimde temsil edilmeyeceğini varsayar. Gerçekten çok büyük veya gerçekten çok küçük bir sayı ise, durum böyle olmayacak ve bu yöntem bozulacaktır.
GordonM

20

Sadece farklı olmak için :)

list($whole, $decimal) = sscanf(1.5, '%d.%d');

CodePad .

Ek bir avantaj olarak, yalnızca her iki tarafın rakamlardan oluştuğu yerlerde bölünecektir.


2
Sayı ondalık kısım içermiyorsa bu kırılmaz. Harika!
Andreyco

Bunun iki tamsayı çıkarması güzel; int ve float yerine.
foochow

1
Bu, diziye dönüştürüldüğünde sayının bilimsel gösterimde temsil edilmeyeceğini varsayar. Gerçekten çok büyük veya gerçekten çok küçük bir sayı ise, durum böyle olmayacak ve bu yöntem bozulacaktır.
GordonM

19

Floor () yöntemi negatif sayılar için çalışmaz. Bu her seferinde işe yarar:

$num = 5.7;
$whole = (int) $num;  // 5
$frac  = $num - $whole;  // .7

... negatifler için de işe yarar (aynı kod, farklı numara):

$num = -5.7;
$whole = (int) $num;  // -5
$frac  = $num - $whole;  // -.7

8

kısa bir yol (zemin ve fmod kullanın)

$var = "1.25";
$whole = floor($var);     // 1
$decimal = fmod($var, 1); //0.25

ardından $ ondalık ile 0, .25, .5 veya .75 değerini karşılaştırın


Bu cevabı kabul ediyorum! C # 'lara yakındır (a % 1)VE negatif sayıları iyi idare eder.
Bitterblue

7

Bir int olarak at ve çıkar

$integer = (int)$your_number;
$decimal = $your_number - $integer;

Veya karşılaştırma için ondalık sayı elde etmek için

$decimal = $your_number - (int)$your_number

5

Kullanılabilecek bir fmod işlevi de var: fmod ($ my_var, 1) aynı sonucu döndürecektir, ancak bazen küçük bir yuvarlak hatasıyla.


4

PHP 5.4+

$n = 12.343;
intval($n); // 12
explode('.', number_format($n, 1))[1]; // 3
explode('.', number_format($n, 2))[1]; // 34
explode('.', number_format($n, 3))[1]; // 343
explode('.', number_format($n, 4))[1]; // 3430

2

Bu benim kullandığım yol:

$float = 4.3;    

$dec = ltrim(($float - floor($float)),"0."); // result .3

1

Brad Christie'nin yöntemi esasen doğrudur, ancak daha kısaca yazılabilir.

function extractFraction ($value) 
{
    $fraction   = $value - floor ($value);
    if ($value < 0)
    {
        $fraction *= -1;
    }

    return $fraction;
}

Bu, onun yöntemine eşdeğerdir, ancak daha kısadır ve sonuç olarak anlaşılması daha kolaydır.



1

Her zaman 2 ondalık basamağa sahip olacağına güvenebilirseniz, sadece bir dize işlemi kullanabilirsiniz:

$decimal = 1.25;
substr($decimal,-2);  // returns "25" as a string

Performans hakkında hiçbir fikrim yok ama benim basit durumum için bu çok daha iyiydi ...


Not: Bunu yaparsanız, en azından round ($ decimal, 2) kullanmalısınız; önce ondalık olarak yalnızca iki basamağa sahip olduğunuzdan emin olmak için. Ancak doğru matematiğe sahip olmak veya parayı idare etmek istiyorsanız bunu kullanamazsınız.
Ulrik McArdle

0

Fazladan kayan ondalık sayıyı önlemek için (yani 50.85 - 50, 0.850000000852 verir), benim durumumda para senti için sadece 2 ondalık sayıya ihtiyacım var.

$n = 50.85;
$whole = intval($n);
$fraction = $n * 100 % 100;

0

Ondalık sayıdan sonraki dolar tutarı ile tutarı gerçekten ayırmanın bir yolunu bulmakta zorlanıyordum. Sanırım çoğunlukla anladım ve herhangi biriniz sorun yaşıyorsa paylaşmayı düşündüm

Yani temelde ...

fiyat 1234.44 ise ... tam 1234 olur ve ondalık 44 veya

fiyat 1234.01 ise ... tüm 1234 ve ondalık 01 veya

fiyat 1234.10 ise ... tam 1234 olur ve ondalık 10 olur

ve benzeri

$price = 1234.44;

$whole = intval($price); // 1234
$decimal1 = $price - $whole; // 0.44000000000005 uh oh! that's why it needs... (see next line)
$decimal2 = round($decimal1, 2); // 0.44 this will round off the excess numbers
$decimal = substr($decimal2, 2); // 44 this removed the first 2 characters

if ($decimal == 1) { $decimal = 10; } // Michel's warning is correct...
if ($decimal == 2) { $decimal = 20; } // if the price is 1234.10... the decimal will be 1...
if ($decimal == 3) { $decimal = 30; } // so make sure to add these rules too
if ($decimal == 4) { $decimal = 40; }
if ($decimal == 5) { $decimal = 50; }
if ($decimal == 6) { $decimal = 60; }
if ($decimal == 7) { $decimal = 70; }
if ($decimal == 8) { $decimal = 80; }
if ($decimal == 9) { $decimal = 90; }

echo 'The dollar amount is ' . $whole . ' and the decimal amount is ' . $decimal;

-1

Burada basit bir modül görülmüyor ...

$number         = 1.25;
$wholeAsFloat   = floor($number);   // 1.00
$wholeAsInt     = intval($number);  // 1
$decimal        = $number % 1;      // 0.25

Bu durumda ikisini birden elde edin $wholeAs?ve $decimaldiğerine bağlı kalmayın. (3 çıktıdan birini bağımsız olarak alabilirsiniz.) Gösterdim $wholeAsFloatve $wholeAsIntçünküfloor() döndürdüğü sayı her zaman tam olsa bile bir float türü sayı döndürüyor. (Sonucu tür ipucu içeren bir işlev parametresine geçiriyorsanız bu önemlidir.)

Bunun, bir DateInterval örneği için saat / dakika gibi kayan nokta sayısını saat ve dakikaya ayrı ayrı 96 saat 15 dakika olarak bölmesini istedim . Bunu şu şekilde yaptım:

$interval = new \DateInterval(sprintf("PT%dH%dM", intval($hours), (($hours % 1) * 60)));

Benim durumumda saniyeler umrumda değildi.


-3
val = -3.1234

fraction = abs(val - as.integer(val) ) 

2
Merhaba, kodunuzu anlamanıza yardımcı olduğu için kodla birlikte biraz açıklama ekleyin. Yalnızca kod yanıtları hoş karşılanmaz.
Bhargav Rao
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.