开发者

What would be the best way to detect if a float has a zero fraction value (e.g. 125.00) in PHP?

开发者 https://www.devze.com 2023-01-26 20:39 出处:网络
See, I want to write a function that takes a float number parameter and rounds the float to the nearest currency value (a float with two decimal places) but if the float parameter has a zero fraction

See, I want to write a function that takes a float number parameter and rounds the float to the nearest currency value (a float with two decimal places) but if the float parameter has a zero fraction (that is, all zeroes behind the decimal place) then it returns the float as an integer (or i.e. truncates the decimal part since they're all zeroes anyways.).

However, I'm 开发者_如何学Cfinding that I can't figure out how to determine if if a fraction has a zero fraction. I don't know if there's a PHP function that already does this. I've looked. The best I can think of is to convert the float number into an integer by casting it first and then subtract the integer part from the float and then check if the difference equals to zero or not.


if($value == round($value))
{
    //no decimal, go ahead and truncate.
}

This example compares the value to itself, rounded to 0 decimal places. If the value rounded is the same as the value, you've got no decimal fraction. Plain and simple.


A little trick with PHPs type juggling abilities

if ($a == (int) $a) {
    // $a has a zero fraction value
}


I think the best way:

if ((string)$value == (int)$value){
    ...
}

Example:

$value = 2.22 * 100;
var_dump($value == (int)$value); // false - WRONG!
var_dump($value == round($value)); // false - WRONG!
var_dump((string)$value == (int)$value); // true - OK!


function whatyouneed($number) {
    $decimals = 2;
    printf("%.".($number == (int)($number) ? '0' : $decimals)."F", $number);
}

So basically it's either printf("%.2F") if you want 2 decimals and printf("%.2F") if you want none.


Well, the problem is that floats aren't exact. Read here if you're interested in finding out why. What I would do is decide on a level of accuracy, for example, 3 decimal places, and base exactness on that. To do that, you multiply it by 1000, cast it to an int, and then check if $your_number % 1000==0.

$mynumber = round($mynumber *1000);
if ($mynumber % 1000==0)
{ isInt() }


Just so you know, you don't have to write a function to do that, there's already one that exists:

$roundedFloat = (float)number_format("1234.1264", 2, ".", ""); // 1234.13

If you want to keep the trailing .00, just omit the float cast (although it will return a string):

$roundedFloatStr = number_format("1234.000", 2, ".", ""); // 1234.00
0

精彩评论

暂无评论...
验证码 换一张
取 消