Get only integer part in php

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.25

then 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_number

answered 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]; // 3430

answered 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 string

No 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 8h46m

answered 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.25

In 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

How can I get integer part of a number in PHP?

“get integer part of decimal php” Code Answer's.
$price = 1234.44;.
$whole = intval($price); // 1234..
$decimal1 = $price - $whole; // 0.44000000000005 uh oh! ... .
$decimal2 = round($decimal1, 2); // 0.44 this will round off the excess numbers..
$decimal = substr($decimal2, 2); // 44 this removed the first 2 characters..

How can I get integer part of a float in PHP?

The round() function rounds a floating-point number. Tip: To round a number UP to the nearest integer, look at the ceil() function. Tip: To round a number DOWN to the nearest integer, look at the floor() function.

How can I get 2 decimal places in PHP?

Use number_format() Function to Show a Number to Two Decimal Places in PHP..
Use round() Function to Show a Number to Two Decimal Places in PHP..
Use sprintf() Function to Show a Number to Two Decimal Places in PHP..
Related Article - PHP Number..

How do you find the decimal part of a number?

An alternative approach is to use the modulo operator. Use the modulo (%) operator to get the decimal part of a number, e.g. const decimal = num % 1 . When used with a divisor of 1 , the modulo operator returns the decimal part of the number.

Chủ đề