PHP 四舍五入为整数

PHP round to integer

我想对一个数字进行舍入,我需要一个合适的整数,因为我想将它用作数组键。第一个想到的"solution"是:

$key = (int)round($number)

但是,我不确定这是否总是有效。据我所知,(int) 只是截断任何小数,并且由于 round($number) returns 理论上精度有限的浮点数,是否有可能 round($number) returns 像 7.999999 ... 然后 $key 是 7 而不是 8?

如果确实存在这个问题(我不知道如何测试),如何解决?也许:

$key = (int)(round($number) + 0.0000000000000000001) // number of zeros chosen arbitrarily

还有比这更好的解决方案吗?

四舍五入到最接近的整数

$key = round($number, 0);

要正确舍入浮点数,您可以使用:

那些函数 return 浮动,但来自 "Integers stored within floats are always accurate, up to around 2^51, which is much more than can be stored in an int anyway."

round(),没有设置精度总是四舍五入到最接近的整数。默认情况下,四舍五入到零个小数位。

所以:

$int = 8.998988776636;
round($int) //Will always be 9

$int = 8.344473773737377474;
round($int) //will always be 8

因此,如果您的目标是将其用作数组的键,这应该没问题。

当然,您可以使用模式和精度来准确指定您希望 round() 的行为方式。参见 this

更新

您实际上可能对 intval 更感兴趣:

echo intval(round(4.7)); //returns int 5
echo intval(round(4.3)); // returns int 4

存储在浮点数中的整数总是准确的,最多大约 253,这比可以存储在 int 中的整数要多得多。我什么都不担心。

在转换为 int 之前简单地添加 1/2 怎么样?

例如:

$int = (int) ($float + 0.5);

这应该会给出可预测的结果。

For My Case, I have to make whole number by float or decimal type number. By these way i solved my problem. Hope It works For You.

$value1 = "46.2";
$value2 = "46.8";


// If we print by round()
echo round( $value1 );    //return float 46.0
echo round( $value2 );    //return float 47.0


// To Get the integer value
echo intval(round( $value1 ));   // return int 46
echo intval(round( $value2 ));   // return int 47

我的解决方案:

function money_round(float $val, int $precision = 0): float|int
{
    $pow = pow(10, $precision);

    $result = (float)(intval((string)($val * $pow)) / $pow);
    if (str_contains((string)$result, '.')) {
        return (float)(intval((string)($val * $pow)) / $pow);
    }
    else {
        return (int)(intval((string)($val * $pow)) / $pow);
    }
}