113 votes

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

Étant donné, disons, 1,25 - comment puis-je obtenir les parties "1" et . "25" de ce nombre ?

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

0 votes

Est-ce qu'une simple explosion fonctionnera ? $splitDec = explode(".", $decimal) ; $splitDec[0] sera maintenant par le 1 et splitDec[1] sera maintenant 25 de votre exemple.

0 votes

@Matt split() a été déprécié.

0 votes

@alex oui, j'ai oublié. Je pensais à javascript. J'ai changé pour exploser.

204voto

Brad Christie Points 58505
$n = 1.25;
$whole = floor($n);      // 1
$fraction = $n - $whole; // .25

Puis comparez avec 1/4, 1/2, 3/4, etc.


En cas de nombres négatifs, 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
  );
}

En $returnUnsigned l'empêche de faire -1.25 à -1 & -0.25

8 votes

Sur le côté, intval() ou un simple moulage comme (int) pourrait être plus performant que floor()

1 votes

Comment le plancher tient-il compte des négatifs ?

0 votes

@LanceH : Il ne le fait pas, mais vous pouvez le faire gérer assez facilement avec un drapeau négatif.

40voto

shelhamer Points 4327

Ce code va le diviser pour vous :

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

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

13 votes

Sachez que explode(".",1.10); donnera 1 et 1, pas 1 et 10

4 votes

Cela casse et lance un avertissement à propos d'un index indéfini, si le nombre est un entier ou ne contient pas de partie décimale.

1 votes

Cela suppose que le nombre ne sera pas représenté en notation scientifique lorsqu'il sera converti en chaîne. S'il s'agit d'un nombre vraiment très grand ou vraiment très petit, ce ne sera pas le cas et cette méthode ne fonctionnera pas.

21voto

alex Points 186293

Juste pour être différent :)

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

CodePad .

En outre, il ne se divisera que si les deux côtés sont composés de chiffres.

2 votes

Celui-ci ne casse pas si le nombre ne contient pas de partie décimale. Excellent !

0 votes

C'est bien que cela produise deux entiers, plutôt qu'un int et un float.

1 votes

Cela suppose que le nombre ne sera pas représenté en notation scientifique lorsqu'il sera converti en chaîne. S'il s'agit d'un nombre vraiment très grand ou vraiment très petit, ce ne sera pas le cas et cette méthode ne fonctionnera pas.

5voto

ip512 Points 31

Il y a aussi une fonction fmod, qui peut être utilisée : fmod($my_var, 1) retournera le même résultat, mais parfois avec une petite erreur d'arrondi.

2voto

C'est la méthode que j'utilise :

$float = 4.3;    

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X