web-dev-qa-db-fra.com

Comment obtenir une partie entière et décimale d'un nombre?

Par exemple, 1.25 - comment puis-je obtenir les parties "1" et "25" de ce nombre? 

Je dois vérifier si la partie décimale est .0, .25, .5 ou .75.

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

Comparez ensuite 1/4, 1/2, 3/4, etc.


En cas de nombre négatif, utilisez ceci:

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

Le $returnUnsigned l’empêche de faire -1,25 dans à -1 & -0,25

145
Brad Christie

Ce code va le scinder pour vous:

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

où $ entier est le nombre entier et $ décimal aura les chiffres après le point décimal.

29
shelhamer

Juste pour être différent :)

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

CodePad .

De plus, il ne sera divisé que si les deux côtés sont composés de chiffres.

18
alex

La méthode floor () ne fonctionne pas pour les nombres négatifs. Cela fonctionne à chaque fois:

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

... fonctionne également pour les négatifs (même code, numéro différent):

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

Jeter comme un int et soustraire

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

Ou juste pour obtenir la décimale pour la comparaison

$decimal = $your_number - (int)$your_number
6
Dom

un chemin court (utilisez floor et fmod)

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

puis comparez $ décimal à 0, 0,25, 0,5 ou 0,75

6
mpalencia

Il y a aussi une fonction fmod qui peut être utilisée:.

4
ip512

C'est la façon dont j'utilise:

$float = 4.3;    

$dec = ltrim(($float - floor($float)),"0."); // result .3
2
Serdar Değirmenci

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
Vasil Nikolov

La méthode de Brad Christie est essentiellement correcte mais elle peut être écrite de manière plus concise. 

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

    return $fraction;
}

Cela équivaut à sa méthode, mais il est donc plus court et, espérons-le, plus facile à comprendre. 

1
GordonM

Pas vu un module simple ici ...

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

Dans ce cas, obtenir $wholeAs? et $decimal ne dépend pas de l'autre. (Vous pouvez juste prendre l'une des 3 sorties indépendamment.) J'ai montré $wholeAsFloat et $wholeAsInt car floor() renvoie un numéro de type float même si le nombre renvoyé sera toujours entier. (Ceci est important si vous passez le résultat dans un paramètre de fonction à indice de type.)

Je voulais que cela divise un nombre d'heures/minutes en virgule flottante, par exemple. 96.25, en heures et minutes séparément pour un DateInterval instance de 96 heures 15 minutes. Je l'ai fait comme suit:

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

Je me fichais des secondes dans mon cas.

0
Adambean
$x = 1.24

$result = $x - floor($x);

echo $result; // .24
0
Stnfordly

Pour éviter la décimale supplémentaire flottante (c'est-à-dire 50,85 - 50, donnez 0,850000000852), dans mon cas, il me faut juste 2 décimales pour des centimes d'argent.

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

J'avais du mal à trouver un moyen de séparer le montant en dollars et le montant après la virgule. Je pense que je l'ai compris la plupart du temps et pensé à partager si certains d'entre vous avaient des problèmes

Donc en gros...

si le prix est 1234.44 ... ensemble serait 1234 et décimale serait 44 ou

si le prix est 1234,01 ... entier serait 1234 et décimale serait 01 ou

si le prix est 1234.10 ... l'ensemble serait 1234 et le nombre décimal serait 10 

et ainsi de suite

$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;
0
Julie

Si vous pouvez toujours compter sur deux décimales, vous pouvez simplement utiliser une opération de chaîne:

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

Aucune idée de performance mais pour mon cas simple c'était beaucoup mieux ...

0
Ben Barreth