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);
要正确舍入浮点数,您可以使用:
ceil($number)
:四舍五入
round($number, 0)
:四舍五入到最接近的整数
floor($number)
:向下舍入
那些函数 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);
}
}
我想对一个数字进行舍入,我需要一个合适的整数,因为我想将它用作数组键。第一个想到的"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);
要正确舍入浮点数,您可以使用:
ceil($number)
:四舍五入round($number, 0)
:四舍五入到最接近的整数floor($number)
:向下舍入
那些函数 return 浮动,但来自
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);
}
}