PHP округляется до целого

Я хочу округлить число, и мне нужно собственное целое число, потому что я хочу использовать его в качестве ключа массива. Первое «решение», которое приходит на ум, – это:

$key = (int)round($number) 

Однако я не уверен, что это всегда будет работать. Насколько я знаю (int) просто усекает любые десятичные числа, и поскольку round($number) возвращает float с теоретически ограниченной точностью, возможно ли, что round($number) возвращает что-то вроде 7.999999 … а затем $key вместо 7 из 8?

Если эта проблема действительно существует (я не знаю, как ее проверить), как ее можно решить? Может быть:

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

Есть ли лучшее решение, чем это?

Для правильного округления плавания вы можете использовать:

  • ceil($number) : округлить
  • round($number, 0) : округление до ближайшего целого числа
  • floor($number) : округлить

Эти функции возвращают float, но из комментария Niet the Dark Absol : «Целые числа, хранящиеся в поплавках, всегда точны, примерно до 2 ^ 51, что намного больше, чем может быть сохранено в int в любом случае».

Существует три функции для обработки чисел округления: круглые, потолочные (округлые), пол (округлые). Я не уверен, какой из них вы хотите использовать.

round() , без набора точности всегда округляется до ближайшего целого числа. По умолчанию круглые раунды равны нулю.

Так:

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

Итак, если ваша цель – использовать это как ключ для массива, это должно быть хорошо.

Разумеется, вы можете использовать режимы и точность, чтобы точно указать, как вы хотите, чтобы round() вел себя так. Смотрите это .

ОБНОВИТЬ

На самом деле вас больше интересует intval :

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

Целые числа, хранящиеся в полях с плавающей точкой, всегда точны, примерно до 2 53 , что намного больше, чем может быть сохранено в int так или иначе. Я ничего не переживаю.

Раунд до ближайшего целого

$ key = round ($ number, 0);