round

(PHP 4, PHP 5, PHP 7, PHP 8)

round β€” ΠžΠΊΡ€ΡƒΠ³Π»ΡΠ΅Ρ‚ число с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ

ОписаниС

function round(int|float $num, int $precision = 0, int|RoundingMode $mode = RoundingMode::HalfAwayFromZero): float

Ѐункция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ числа num, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠΊΡ€ΡƒΠ³Π»ΠΈΠ»Π° с Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ precision β€” количСство Ρ†ΠΈΡ„Ρ€ послС запятой. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ точности precision ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ значСния ΠΈ ноль β€” Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

Бписок ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²

num

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ трСбуСтся ΠΎΠΊΡ€ΡƒΠ³Π»ΠΈΡ‚ΡŒ.

precision

ΠΠ΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ количСство дСсятичных Π·Π½Π°ΠΊΠΎΠ², Π΄ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… функция ΠΎΠΊΡ€ΡƒΠ³Π»ΠΈΡ‚ число.

Ѐункция ΠΎΠΊΡ€ΡƒΠ³Π»ΠΈΡ‚ число num Π΄ΠΎ Ρ‚Π°ΠΊΠΎΠ³ΠΎ количСства Π·Π½Π°Ρ‡Π°Ρ‰ΠΈΡ… Ρ†ΠΈΡ„Ρ€ послС дСсятичной Ρ‚ΠΎΡ‡ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡƒΠΊΠ°Π·Π°Π»ΠΈ Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ precision, Ссли Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ precision ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Π°.

Ѐункция ΠΎΠΊΡ€ΡƒΠ³Π»ΠΈΡ‚ число num Π΄ΠΎ Ρ‚Π°ΠΊΠΎΠ³ΠΎ количСства Π·Π½Π°Ρ‡Π°Ρ‰ΠΈΡ… Ρ†ΠΈΡ„Ρ€ ΠΏΠ΅Ρ€Π΅Π΄ дСсятичной Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡƒΠΊΠ°Π·Π°Π»ΠΈ Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ precision, Ссли Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ precision ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Π°. ΠŸΡ€ΠΈ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ точности функция округляСт число Π΄ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΡ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° выраТСния pow(10, -$precision). Число num округляСтся Π΄ΠΎ дСсятков, Ссли Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ precision Ρ€Π°Π²Π½Π° -1, Π΄ΠΎ сотСн, Ссли Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ precision Ρ€Π°Π²Π½Π° -2, ΠΈ Ρ‚. Π΄.

mode

Π Π΅ΠΆΠΈΠΌ округлСния ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ пСрСчислСниСм RoundingMode ΠΈΠ»ΠΈ константой ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ списка:

ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Ρ‹ ОписаниС
PHP_ROUND_HALF_UP ΠžΠΊΡ€ΡƒΠ³Π»ΡΠ΅Ρ‚ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ число num Π² Π±ΠΎΜΠ»ΡŒΡˆΡƒΡŽ сторону, Π° ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π² ΠΌΠ΅Π½ΡŒΡˆΡƒΡŽ, прСвращая 1.5 Π² 2 ΠΈ -1.5 Π² -2; стрСмится ΠΎΡ‚ нуля.
PHP_ROUND_HALF_DOWN ΠžΠΊΡ€ΡƒΠ³Π»ΡΠ΅Ρ‚ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ число num Π² ΠΌΠ΅Π½ΡŒΡˆΡƒΡŽ сторону, Π° ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π² Π±ΠΎΜΠ»ΡŒΡˆΡƒΡŽ, прСвращая 1.5 Π² 1 ΠΈ -1.5 Π² -1; стрСмится ΠΊ Π½ΡƒΠ»ΡŽ.
PHP_ROUND_HALF_EVEN ΠžΠΊΡ€ΡƒΠ³Π»ΡΠ΅Ρ‚ число num Π΄ΠΎ блиТайшСго Ρ‡Ρ‘Ρ‚Π½ΠΎΠ³ΠΎ значСния, прСвращая 1.5 ΠΈ 2.5 Π² 2.
PHP_ROUND_HALF_ODD ΠžΠΊΡ€ΡƒΠ³Π»ΡΠ΅Ρ‚ число num Π΄ΠΎ блиТайшСго Π½Π΅Ρ‡Ρ‘Ρ‚Π½ΠΎΠ³ΠΎ значСния, прСвращая 1.5 Π² 1 ΠΈ 2.5 Π² 3.
ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ€Π΅ΠΆΠΈΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π½Π΅Π΄Π°Π²Π½ΠΎ, доступны Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² пСрСчислСнии RoundingMode.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ значСния

Ѐункция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ число с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ (float), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»Π° ΠΏΡƒΡ‚Ρ‘ΠΌ округлСния Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ числа Π΄ΠΎ точности, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ установили Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ precision.

Ошибки

ΠŸΡ€ΠΈ нСдопустимом Ρ€Π΅ΠΆΠΈΠΌΠ΅ mode функция выбрасываСт ΠΎΡˆΠΈΠ±ΠΊΡƒ ValueError. Π”ΠΎ PHP 8.4.0 для нСдопустимого Ρ€Π΅ΠΆΠΈΠΌΠ° Π±Π΅Π· прСдупрСТдСния ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Π»ΠΎΡΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ PHP_ROUND_HALF_UP.

Бписок измСнСний

ВСрсия ОписаниС
8.4.0 Π”ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π½ΠΎΠ²Ρ‹Π΅ Ρ€Π΅ΠΆΠΈΠΌΠ° округлСния.
8.4.0 Ѐункция Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ выбрасываСт ΠΎΡˆΠΈΠ±ΠΊΡƒ ValueError, Ссли Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ mode ΠΏΠ΅Ρ€Π΅Π΄Π°Π»ΠΈ нСдопустимый Ρ€Π΅ΠΆΠΈΠΌ округлСния.
8.0.0 ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ num большС Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ числовоС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #1 ΠŸΡ€ΠΈΠΌΠ΅Ρ€ округлСния чисСл Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ round()

<?php

var_dump
(round(3.4));
var_dump(round(3.5));
var_dump(round(3.6));
var_dump(round(3.6, 0));
var_dump(round(5.045, 2));
var_dump(round(5.055, 2));
var_dump(round(345, -2));
var_dump(round(345, -3));
var_dump(round(678, -2));
var_dump(round(678, -3));

?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

float(3)
float(4)
float(4)
float(4)
float(5.05)
float(5.06)
float(300)
float(0)
float(700)
float(1000)

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #2 ΠŸΡ€ΠΈΠΌΠ΅Ρ€ влияния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° precision Π½Π° числа с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ

<?php

$number
= 135.79;

var_dump(round($number, 3));
var_dump(round($number, 2));
var_dump(round($number, 1));
var_dump(round($number, 0));
var_dump(round($number, -1));
var_dump(round($number, -2));
var_dump(round($number, -3));

?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

float(135.79)
float(135.79)
float(135.8)
float(136)
float(140)
float(100)
float(0)

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #3 ΠŸΡ€ΠΈΠΌΠ΅Ρ€ влияния Ρ€Π΅ΠΆΠΈΠΌΠ° mode Π½Π° ΠΎΠΊΡ€ΡƒΠ³Π»Π΅Π½ΠΈΠ΅ чисСл

<?php

echo 'Π Π΅ΠΆΠΈΠΌΡ‹ округлСния с 9.5' . PHP_EOL;
var_dump(round(9.5, 0, PHP_ROUND_HALF_UP));
var_dump(round(9.5, 0, PHP_ROUND_HALF_DOWN));
var_dump(round(9.5, 0, PHP_ROUND_HALF_EVEN));
var_dump(round(9.5, 0, PHP_ROUND_HALF_ODD));

echo
PHP_EOL;
echo
'Π Π΅ΠΆΠΈΠΌΡ‹ округлСния с 8.5' . PHP_EOL;
var_dump(round(8.5, 0, PHP_ROUND_HALF_UP));
var_dump(round(8.5, 0, PHP_ROUND_HALF_DOWN));
var_dump(round(8.5, 0, PHP_ROUND_HALF_EVEN));
var_dump(round(8.5, 0, PHP_ROUND_HALF_ODD));

?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

Π Π΅ΠΆΠΈΠΌΡ‹ округлСния с 9.5
float(10)
float(9)
float(10)
float(9)

Π Π΅ΠΆΠΈΠΌΡ‹ округлСния с 8.5
float(9)
float(8)
float(8)
float(9)

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #4 ΠŸΡ€ΠΈΠΌΠ΅Ρ€ округлСния чисСл с Ρ€Π΅ΠΆΠΈΠΌΠΎΠΌ mode ΠΈ Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ precision

<?php

echo 'ΠžΠΊΡ€ΡƒΠ³Π»Π΅Π½ΠΈΠ΅ с Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ Π΄ΠΎ 1 Π·Π½Π°ΠΊΠ° Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ PHP_ROUND_HALF_UP' . PHP_EOL;
var_dump(round( 1.55, 1, PHP_ROUND_HALF_UP));
var_dump(round(-1.55, 1, PHP_ROUND_HALF_UP));

echo
PHP_EOL;
echo
'ΠžΠΊΡ€ΡƒΠ³Π»Π΅Π½ΠΈΠ΅ с Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ Π΄ΠΎ 1 Π·Π½Π°ΠΊΠ° Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ PHP_ROUND_HALF_DOWN' . PHP_EOL;
var_dump(round( 1.55, 1, PHP_ROUND_HALF_DOWN));
var_dump(round(-1.55, 1, PHP_ROUND_HALF_DOWN));

echo
PHP_EOL;
echo
'ΠžΠΊΡ€ΡƒΠ³Π»Π΅Π½ΠΈΠ΅ с Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ Π΄ΠΎ 1 Π·Π½Π°ΠΊΠ° Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ PHP_ROUND_HALF_EVEN' . PHP_EOL;
var_dump(round( 1.55, 1, PHP_ROUND_HALF_EVEN));
var_dump(round(-1.55, 1, PHP_ROUND_HALF_EVEN));

echo
PHP_EOL;
echo
'ΠžΠΊΡ€ΡƒΠ³Π»Π΅Π½ΠΈΠ΅ с Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ Π΄ΠΎ 1 Π·Π½Π°ΠΊΠ° Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ PHP_ROUND_HALF_ODD' . PHP_EOL;
var_dump(round( 1.55, 1, PHP_ROUND_HALF_ODD));
var_dump(round(-1.55, 1, PHP_ROUND_HALF_ODD));

?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

ΠžΠΊΡ€ΡƒΠ³Π»Π΅Π½ΠΈΠ΅ с Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ Π΄ΠΎ 1 Π·Π½Π°ΠΊΠ° Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ PHP_ROUND_HALF_UP
float(1.6)
float(-1.6)

ΠžΠΊΡ€ΡƒΠ³Π»Π΅Π½ΠΈΠ΅ с Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ Π΄ΠΎ 1 Π·Π½Π°ΠΊΠ° Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ PHP_ROUND_HALF_DOWN
float(1.5)
float(-1.5)

ΠžΠΊΡ€ΡƒΠ³Π»Π΅Π½ΠΈΠ΅ с Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ Π΄ΠΎ 1 Π·Π½Π°ΠΊΠ° Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ PHP_ROUND_HALF_EVEN
float(1.6)
float(-1.6)

ΠžΠΊΡ€ΡƒΠ³Π»Π΅Π½ΠΈΠ΅ с Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ Π΄ΠΎ 1 Π·Π½Π°ΠΊΠ° Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ PHP_ROUND_HALF_ODD
float(1.5)
float(-1.5)

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #5 ΠŸΡ€ΠΈΠΌΠ΅Ρ€ установки Ρ€Π΅ΠΆΠΈΠΌΠ° округлСния пСрСчислСниСм RoundingMode

<?php

foreach (RoundingMode::cases() as $mode) {
foreach ([
8.5,
9.5,
-
3.5,
] as
$number) {
printf("%-17s: %+.17g -> %+.17g\n", $mode->name, $number, round($number, 0, $mode));
}
echo
"\n";
}

?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

HalfAwayFromZero : +8.5 -> +9
HalfAwayFromZero : +9.5 -> +10
HalfAwayFromZero : -3.5 -> -4

HalfTowardsZero  : +8.5 -> +8
HalfTowardsZero  : +9.5 -> +9
HalfTowardsZero  : -3.5 -> -3

HalfEven         : +8.5 -> +8
HalfEven         : +9.5 -> +10
HalfEven         : -3.5 -> -4

HalfOdd          : +8.5 -> +9
HalfOdd          : +9.5 -> +9
HalfOdd          : -3.5 -> -3

TowardsZero      : +8.5 -> +8
TowardsZero      : +9.5 -> +9
TowardsZero      : -3.5 -> -3

AwayFromZero     : +8.5 -> +9
AwayFromZero     : +9.5 -> +10
AwayFromZero     : -3.5 -> -4

NegativeInfinity : +8.5 -> +8
NegativeInfinity : +9.5 -> +9
NegativeInfinity : -3.5 -> -4

PositiveInfinity : +8.5 -> +9
PositiveInfinity : +9.5 -> +10
PositiveInfinity : -3.5 -> -3

Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅

  • ceil() - ΠžΠΊΡ€ΡƒΠ³Π»ΡΠ΅Ρ‚ Π΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ число Π² Π±ΠΎΜΠ»ΡŒΡˆΡƒΡŽ сторону
  • floor() - ΠžΠΊΡ€ΡƒΠ³Π»ΡΠ΅Ρ‚ Π΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ число Π² ΠΌΠ΅Π½ΡŒΡˆΡƒΡŽ сторону
  • number_format() - Π€ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ число с Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ классов ΠΌΠ½ΠΎΠ³ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΠ³ΠΎ числа
οΌ‹Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ 13 notes

up
329
takingsides at gmail dot com ΒΆ
12 years ago
In my opinion this function lacks two flags:

- PHP_ROUND_UP - Always round up.
- PHP_ROUND_DOWN - Always round down.

In accounting, it's often necessary to always round up, or down to a precision of thousandths.

<?php
function round_up($number, $precision = 2)
{
    $fig = (int) str_pad('1', $precision, '0');
    return (ceil($number * $fig) / $fig);
}

function round_down($number, $precision = 2)
{
    $fig = (int) str_pad('1', $precision, '0');
    return (floor($number * $fig) / $fig);
}
?>
up
33
depaula at unilogica dot com ΒΆ
9 years ago
As PHP doesn't have a a native number truncate function, this is my solution - a function that can be usefull if you need truncate instead round a number.

<?php
/**
 * Truncate a float number, example: <code>truncate(-1.49999, 2); // returns -1.49
 * truncate(.49999, 3); // returns 0.499
 * </code>
 * @param float $val Float number to be truncate
 * @param int f Number of precision
 * @return float
 */
function truncate($val, $f="0")
{
    if(($p = strpos($val, '.')) !== false) {
        $val = floatval(substr($val, 0, $p + 1 + $f));
    }
    return $val;
}
?>

Originally posted in http://stackoverflow.com/a/12710283/1596489
up
31
slimusgm at gmail dot com ΒΆ
11 years ago
If you have negative zero and you need return positive number simple add +0:

$number = -2.38419e-07;
var_dump(round($number,1));//float(-0)
var_dump(round($number,1) + 0);//float(0)
up
20
esion99 at gmail dot com ΒΆ
11 years ago
Unexpected result or misunderstanding (php v5.5.9)

<?php

echo round(1.55, 1, PHP_ROUND_HALF_DOWN); // 1.5
echo round(1.551, 1, PHP_ROUND_HALF_DOWN); //1.6

?>
up
21
djcox99 at googlemail dot com ΒΆ
12 years ago
I discovered that under some conditions you can get rounding errors with round when converting the number to a string afterwards.

To fix this I swapped round() for number_format().

Unfortunately i cant give an example (because the number cant be represented as a string !)

essentially I had round(0.688888889,2);

which would stay as 0.68888889 when printed as a string.

But using number_format it correctly became 0.69.
up
10
craft at ckdevelop dot org ΒΆ
12 years ago
function mround($val, $f=2, $d=6){
    return sprintf("%".$d.".".$f."f", $val);
}

echo mround(34.89999);  //34.90
up
18
twan at ecreation dot nl ΒΆ
26 years ago
If you'd only want to round for displaying variables (not for calculating on the rounded result) then you should use printf with the float:

<?php printf ("%6.2f",3.39532); ?>

This returns: 3.40 .
up
16
Anonymous ΒΆ
15 years ago
Here is function that rounds to a specified increment, but always up. I had to use it for price adjustment that always went up to $5 increments.

<?php  
function roundUpTo($number, $increments) {
    $increments = 1 / $increments;
    return (ceil($number * $increments) / $increments);
}
?>
up
8
christian at deligant dot net ΒΆ
14 years ago
this function (as all mathematical operators) takes care of the setlocale setting, resulting in some weirdness when using the result where the english math notation is expected, as the printout of the result in a width: style attribute!

<?php
$a=3/4;
echo round($a, 2); // 0.75

setlocale(LC_ALL, 'it_IT@euro', 'it_IT', 'it');
$b=3/4;
echo round($b,2); // 0,75
?>
up
7
michaeldnelson dot mdn at gmail dot com ΒΆ
16 years ago
This function will let you round to an arbitrary non-zero number.  Zero of course causes a division by zero.

<?php
function roundTo($number, $to){
    return round($number/$to, 0)* $to;
}

echo roundTo(87.23, 20); //80
echo roundTo(-87.23, 20); //-80
echo roundTo(87.23, .25); //87.25
echo roundTo(.23, .25); //.25
?>
up
3
greghenle at gmail dot com ΒΆ
9 years ago
/**
 * Round to first significant digit
 * +N to +infinity
 * -N to -infinity
 *
 */
function round1stSignificant ( $N ) {
  if ( $N === 0 ) {
    return 0;
  }

  $x = floor ( log10 ( abs( $N ) ) );

  return ( $N > 0 )
    ? ceil( $N * pow ( 10, $x * -1 ) ) * pow( 10, $x )
    : floor( $N * pow ( 10, $x * -1 ) ) * pow( 10, $x );
}

echo round1stSignificant( 39144818 ) . PHP_EOL;
echo round1stSignificant( 124818 ) . PHP_EOL;
echo round1stSignificant( 0.07468 ) . PHP_EOL;
echo round1stSignificant( 0 ) . PHP_EOL;
echo round1stSignificant( -0.07468 ) . PHP_EOL;

/**
 * Output
 * 
 * 40000000
 * 200000
 * 0.08
 * 0
 * -0.08
 * 
 */
up
4
dastra ΒΆ
13 years ago
round() will sometimes return E notation when rounding a float when the amount is small enough - see  https://bugs.php.net/bug.php?id=44223 .  Apparently it's a feature.

To work around this "feature" when converting to a string, surround your round statement with an sprintf:

sprintf("%.10f", round( $amountToBeRounded, 10));
up
8
php at silisoftware dot com ΒΆ
23 years ago
Here's a function to round to an arbitary number of significant digits. Don't confuse it with rounding to a negative precision - that counts back from the decimal point, this function counts forward from the Most Significant Digit.

ex:

<?php
round(1241757, -3); // 1242000
RoundSigDigs(1241757, 3); // 1240000
?>

Works on negative numbers too. $sigdigs should be >= 0

<?php
function RoundSigDigs($number, $sigdigs) {
    $multiplier = 1;
    while ($number < 0.1) {
        $number *= 10;
        $multiplier /= 10;
    }
    while ($number >= 1) {
        $number /= 10;
        $multiplier *= 10;
    }
    return round($number, $sigdigs) * $multiplier;
}
?>