É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 .0, .25, .5 ou .75.
split()
est obsolète.
explode(".",1.10);
wil donnera 1 et 1, pas 1 et 10
É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 .0, .25, .5 ou .75.
split()
est obsolète.
explode(".",1.10);
wil donnera 1 et 1, pas 1 et 10
Réponses:
$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
);
}
L' $returnUnsigned
empêche de faire -1,25 po à -1 et -0,25
intval()
ou simple casting qui (int)
pourrait être plus performant quefloor()
Ce code le divisera pour vous:
list($whole, $decimal) = explode('.', $your_number);
où $ entier est le nombre entier et $ decimal aura les chiffres après la virgule décimale.
explode(".",1.10);
wil donnera 1 et 1, pas 1 et 10
Juste pour être différent :)
list($whole, $decimal) = sscanf(1.5, '%d.%d');
CodePad .
Comme avantage supplémentaire, il ne sera divisé que lorsque les deux côtés se composent 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 - $whole; // .7
... fonctionne également pour les négatifs (même code, numéro différent):
$num = -5.7;
$whole = (int) $num; // -5
$frac = $num - $whole; // -.7
un chemin court (utilisez floor et fmod)
$var = "1.25";
$whole = floor($var); // 1
$decimal = fmod($var, 1); //0.25
puis comparez $ decimal à 0, .25, .5 ou .75
(a % 1)
ET il gère bien les nombres négatifs.
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
C'est la manière dont j'utilise:
$float = 4.3;
$dec = ltrim(($float - floor($float)),"0."); // result .3
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;
}
Ceci est équivalent à sa méthode mais plus court et, espérons-le, plus facile à comprendre.
Si vous pouvez vous attendre à ce qu'il ait toujours 2 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 bien mieux ...
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 surtout compris et j'ai pensé à partager si l'un d'entre vous avait des problèmes
Donc en gros...
si le prix est 1234,44 ... le tout serait 1234 et la décimale serait 44 ou
si le prix est 1234,01 ... le tout serait 1234 et le nombre décimal serait 01 ou
si le prix est 1234,10 ... le tout serait 1234 et la décimale 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;
Pas vu un simple module ici ...
$number = 1.25;
$wholeAsFloat = floor($number); // 1.00
$wholeAsInt = intval($number); // 1
$decimal = $number % 1; // 0.25
Dans ce cas, obtenir à la fois $wholeAs?
et$decimal
ne dépend pas de l'autre. (Vous pouvez simplement prendre 1 des 3 sorties indépendamment.) J'ai montré $wholeAsFloat
et $wholeAsInt
parce quefloor()
renvoie un nombre de type flottant même si le nombre qu'il renvoie sera toujours entier. (Ceci est important si vous transmettez le résultat dans un paramètre de fonction d'indication de type.)
Je voulais que cela divise un nombre d'heures / minutes à virgule flottante, par exemple 96,25, en heures et minutes séparément pour un instance de DateInterval en 96 heures 15 minutes. J'ai fait ceci comme suit:
$interval = new \DateInterval(sprintf("PT%dH%dM", intval($hours), (($hours % 1) * 60)));
Je me fichais des secondes dans mon cas.
val = -3.1234
fraction = abs(val - as.integer(val) )