How to get whole and decimal part of a number?

前端 未结 16 1150
名媛妹妹
名媛妹妹 2020-11-27 03:10

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.

相关标签:
16条回答
  • 2020-11-27 04:01

    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.

    0 讨论(0)
  • 2020-11-27 04:02

    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
    
    0 讨论(0)
  • 2020-11-27 04:02

    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.

    0 讨论(0)
  • 2020-11-27 04:04

    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;
    
    0 讨论(0)
提交回复
热议问题