Biorąc pod uwagę, powiedzmy, 1,25 - jak uzyskać części „1” i „25” tej liczby?
Muszę sprawdzić, czy część dziesiętna to .0, .25, .5 lub .75.
split()
został wycofany.
explode(".",1.10);
poda 1 i 1, a nie 1 i 10
Biorąc pod uwagę, powiedzmy, 1,25 - jak uzyskać części „1” i „25” tej liczby?
Muszę sprawdzić, czy część dziesiętna to .0, .25, .5 lub .75.
split()
został wycofany.
explode(".",1.10);
poda 1 i 1, a nie 1 i 10
Odpowiedzi:
$n = 1.25;
$whole = floor($n); // 1
$fraction = $n - $whole; // .25
Następnie porównaj z 1/4, 1/2, 3/4 itd.
W przypadku liczb ujemnych użyj tego:
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
);
}
$returnUnsigned
Zatrzymuje się go z co -1.25 do -1 i -0,25
intval()
lub po prostu casting, który (int)
może być bardziej spektakularny niżfloor()
Ten kod podzieli go za Ciebie:
list($whole, $decimal) = explode('.', $your_number);
gdzie $ całość to liczba całkowita, a $ dziesiętne będą miały cyfry po przecinku.
explode(".",1.10);
poda 1 i 1, a nie 1 i 10
Po prostu być innym :)
list($whole, $decimal) = sscanf(1.5, '%d.%d');
CodePad .
Dodatkową korzyścią jest podział tylko wtedy, gdy obie strony składają się z cyfr.
Metoda floor () nie działa w przypadku liczb ujemnych. Działa to za każdym razem:
$num = 5.7;
$whole = (int) $num; // 5
$frac = $num - $whole; // .7
... działa również w przypadku negatywów (ten sam kod, inna liczba):
$num = -5.7;
$whole = (int) $num; // -5
$frac = $num - $whole; // -.7
krótka droga (użyj floor i fmod)
$var = "1.25";
$whole = floor($var); // 1
$decimal = fmod($var, 1); //0.25
następnie porównaj $ dziesiętnie z 0, 0,25, .5 lub 0,75
(a % 1)
i dobrze obsługuje liczby ujemne.
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
Oto sposób, w jaki używam:
$float = 4.3;
$dec = ltrim(($float - floor($float)),"0."); // result .3
Metoda Brada Christiego jest zasadniczo poprawna, ale można ją napisać bardziej zwięźle.
function extractFraction ($value)
{
$fraction = $value - floor ($value);
if ($value < 0)
{
$fraction *= -1;
}
return $fraction;
}
Jest to odpowiednik jego metody, ale w rezultacie krótszy i miejmy nadzieję, łatwiejszy do zrozumienia.
Jeśli możesz liczyć na to, że zawsze ma 2 miejsca po przecinku, możesz po prostu użyć operacji na łańcuchach:
$decimal = 1.25;
substr($decimal,-2); // returns "25" as a string
Nie mam pojęcia o wydajności, ale w moim prostym przypadku było znacznie lepiej ...
Trudno mi było znaleźć sposób na oddzielenie kwoty w dolarach od kwoty po przecinku. Myślę, że przeważnie to rozgryzłem i pomyślałem, że podzielę się, jeśli któryś z was miałby problemy
Więc w zasadzie ...
jeśli cena wynosi 1234,44 ... całość będzie równa 1234, a liczba dziesiętna to 44 lub
jeśli cena wynosi 1234,01 ... całość będzie wynosić 1234, a dziesiętnie to 01 lub
jeśli cena wynosi 1234,10 ... całość będzie równa 1234, a dziesiętna - 10
i tak dalej
$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;
Nie widziałem tutaj prostego modułu ...
$number = 1.25;
$wholeAsFloat = floor($number); // 1.00
$wholeAsInt = intval($number); // 1
$decimal = $number % 1; // 0.25
W tym przypadku otrzymanie obu $wholeAs?
i $decimal
nie zależy od drugiego. (Możesz po prostu wziąć jedno z 3 wyjść niezależnie.) Pokazałem $wholeAsFloat
i $wholeAsInt
ponieważfloor()
zwraca liczbę typu zmiennoprzecinkowego, mimo że liczba, którą zwraca, zawsze będzie pełna. (Jest to ważne, jeśli przekazujesz wynik do parametru funkcji ze wskazówkami do typu).
Chciałem podzielić zmiennoprzecinkową liczbę godzin / minut, np. 96,25, na godziny i minuty oddzielnie dla instancji DateInterval jako 96 godzin 15 minut. Zrobiłem to w następujący sposób:
$interval = new \DateInterval(sprintf("PT%dH%dM", intval($hours), (($hours % 1) * 60)));
W moim przypadku nie obchodziły mnie sekundy.
val = -3.1234
fraction = abs(val - as.integer(val) )