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.
$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
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.
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.
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
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
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
Il y a aussi une fonction fmod qui peut être utilisée:.
C'est la façon dont j'utilise:
$float = 4.3;
$dec = ltrim(($float - floor($float)),"0."); // result .3
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
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.
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.
$x = 1.24
$result = $x - floor($x);
echo $result; // .24
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;
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;
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 ...