Given, say, 1.25 - how do I get "1" and ."25" parts of this number?
I need to check if the decimal part is .0, .25, .5, or .75.
alex
467k197 gold badges865 silver badges975 bronze badges
asked Jul 8, 2011 at 2:31
5
$n = 1.25; $whole = floor($n); // 1 $fraction = $n - $whole; // .25
Then compare against 1/4, 1/2, 3/4, etc.
In cases of negative numbers, use this:
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 ); }The $returnUnsigned stops it from making -1.25 in to -1 & -0.25
seanbreeden
5,9855 gold badges34 silver badges43 bronze badges
answered Jul 8, 2011 at 2:33
Brad ChristieBrad Christie
98.8k16 gold badges149 silver badges198 bronze badges
6
This code will split it up for you:
list($whole, $decimal) = explode('.', $your_number);where $whole is the whole number and $decimal will have the digits after the decimal point.
answered Jul 8, 2011 at 2:33
5
The floor() method doesn't work for negative numbers. This works every time:
$num = 5.7; $whole = (int) $num; // 5 $frac = $num - $whole; // .7...also works for negatives (same code, different number):
$num = -5.7; $whole = (int) $num; // -5 $frac = $num - $whole; // -.7
evilReiko
18.5k24 gold badges82 silver badges99 bronze badges
answered Feb 6, 2016 at 13:08
thedudethedude
5075 silver badges5 bronze badges
2
Just to be different :)
list($whole, $decimal) = sscanf(1.5, '%d.%d');CodePad.
As an added benefit, it will only split where both sides consist of digits.
answered Jul 8, 2011 at 2:43
alexalex
467k197 gold badges865 silver badges975 bronze badges
6
a short way (use floor and fmod)
$var = "1.25"; $whole = floor($var); // 1 $decimal = fmod($var, 1); //0.25then compare $decimal to 0, .25, .5, or .75
answered Nov 6, 2015 at 8:21
mpalenciampalencia
5,1734 gold badges43 silver badges55 bronze badges
1
Cast it as an int and subtract
$integer = (int)$your_number; $decimal = $your_number - $integer;Or just to get the decimal for comparison
$decimal = $your_number - (int)$your_numberanswered Dec 5, 2014 at 17:28
DomDom
2,7882 gold badges26 silver badges37 bronze badges
There's a fmod function too, that can be used : fmod($my_var, 1) will return the same result, but sometime with a small round error.
answered May 9, 2013 at 19:11
ip512ip512
1302 silver badges9 bronze badges
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]; // 3430answered Sep 14, 2017 at 11:51
This is the way which I use:
$float = 4.3; $dec = ltrim(($float - floor($float)),"0."); // result .3
alex
467k197 gold badges865 silver badges975 bronze badges
answered Mar 14, 2014 at 14:03
Serdar D.Serdar D.
2,8311 gold badge26 silver badges18 bronze badges
Just a new simple solution, for those of you who want to get the Integer part and Decimal part splitted as two integer separated values:
5.25 -> Int part: 5; Decimal part: 25
$num = 5.25; $int_part = intval($num); $dec_part = $num * 100 % 100;This way is not involving string based functions, and is preventing accuracy problems which may arise in other math operations (such as having 0.49999999999999 instead of 0.5).
Haven't tested thoroughly with extreme values, but it works fine for me for price calculations.
But, watch out! Now from -5.25 you get: Integer part: -5; Decimal part: -25
In case you want to get always positive numbers, simply add abs() before the calculations:
$num = -5.25; $num = abs($num); $int_part = intval($num); $dec_part = $num * 100 % 100;Finally, bonus snippet for printing prices with 2 decimals:
$message = sprintf("Your price: %d.%02d Eur", $int_part, $dec_part);...so that you avoid getting 5.5 instead of 5.05. ;)
answered Dec 4, 2020 at 8:57
MarcMMarcM
2,01021 silver badges30 bronze badges
2
Brad Christie's method is essentially correct but it can be written more concisely.
function extractFraction ($value) { $fraction = $value - floor ($value); if ($value < 0) { $fraction *= -1; } return $fraction; }This is equivalent to his method but shorter and hopefully easier to understand as a result.
answered Oct 4, 2015 at 9:40
GordonMGordonM
30.5k15 gold badges86 silver badges129 bronze badges
I was having a hard time finding a way to actually separate the dollar amount and the amount after the decimal. I think I figured it out mostly and thought to share if any of yall were having trouble
So basically...
if price is 1234.44... whole would be 1234 and decimal would be 44 or
if price is 1234.01... whole would be 1234 and decimal would be 01 or
if price is 1234.10... whole would be 1234 and decimal would be 10
and so forth
$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;answered Oct 6, 2017 at 22:30
$x = 1.24 $result = $x - floor($x); echo $result; // .24
answered Mar 27, 2018 at 22:40
If you can count on it always having 2 decimal places, you can just use a string operation:
$decimal = 1.25; substr($decimal,-2); // returns "25" as a stringNo idea of performance but for my simple case this was much better...
answered Mar 24, 2019 at 1:51
Ben BarrethBen Barreth
1,5751 gold badge14 silver badges14 bronze badges
1
To prevent the extra float decimal (i.e. 50.85 - 50 give 0.850000000852), in my case I just need 2 decimals for money cents.
$n = 50.85; $whole = intval($n); $fraction = $n * 100 % 100;answered Sep 1, 2016 at 8:53
fbaudetfbaudet
1761 silver badge6 bronze badges
1
Try it this way... it's easier like this
$var = "0.98"; $decimal = strrchr($var,"."); $whole_no = $var-$decimal; echo $whole_no; echo str_replace(".", "", $decimal);answered Dec 18, 2020 at 14:04
You could also use something like this:
preg_match("/([0-9]+)\.([0-9]+)/", $number, $matches);answered Apr 27, 2021 at 18:45
Inc33Inc33
1,6601 gold badge20 silver badges24 bronze badges
If you want the two halves to be explicitly type cast, then sscanf() is a great call.
Code: (Demo)
var_dump(sscanf(1.25, '%d%f'));Output:
array(2) { [0]=> int(1) [1]=> float(0.25) }Or you can assign the two variables individually:
sscanf(1.25, '%d%f', $int, $float); var_dump($int); var_dump($float);Casting the decimal portion as a float is particularly useful when, say, converting decimal expression of hours to hours and minutes. (Demo)
$decimalTimes = [ 6, 7.2, 8.78, ]; foreach ($decimalTimes as $decimalTime) { sscanf($decimalTime, '%d%f', $hours, $minutes); printf('%dh%02dm', $hours, round($minutes * 60)); echo "\n"; }Output:
6h00m 7h22m 8h47m // if round() was not used, this would be 8h46manswered Sep 3, 2021 at 3:28
mickmackusamickmackusa
39k11 gold badges76 silver badges113 bronze badges
0
Not seen a simple modulus here...
$number = 1.25; $wholeAsFloat = floor($number); // 1.00 $wholeAsInt = intval($number); // 1 $decimal = $number % 1; // 0.25In this case getting both $wholeAs? and $decimal don't depend on the other. (You can just take 1 of the 3 outputs independently.) I've shown $wholeAsFloat and $wholeAsInt because floor() returns a float type number even though the number it returns will always be whole. (This is important if you're passing the result into a type-hinted function parameter.)
I wanted this to split a floating point number of hours/minutes, e.g. 96.25, into hours and minutes separately for a DateInterval instance as 96 hours 15 minutes. I did this as follows:
$interval = new \DateInterval(sprintf("PT%dH%dM", intval($hours), (($hours % 1) * 60)));I didn't care about seconds in my case.
answered Feb 5, 2019 at 16:36
AdambeanAdambean
1,0509 silver badges18 bronze badges
0
val = -3.1234 fraction = abs(val - as.integer(val) )
Bhargav Rao
47.3k27 gold badges122 silver badges137 bronze badges
answered Jan 10, 2016 at 16:55
1