3v4l.org

run code in 300+ PHP versions simultaneously
<?php declare(strict_types=1); function myBcRound(string $numstr, int $precision = 2): string { if ($precision >= 0) { $addition = '0.' . str_repeat('0', $precision) . '5'; } else { throw new Exception('bcround with negative precision is not implemented.'); } return bcdiv(bcadd($numstr, $addition, $precision + 1), '1', $precision); } $testCases = [ ['source' => '123.0454000', 'scale' => 3, 'result' => '123.045'], ['source' => '123.0454499', 'scale' => 3, 'result' => '123.045'], ['source' => '123.0454500', 'scale' => 3, 'result' => '123.045'], ['source' => '123.0454900', 'scale' => 3, 'result' => '123.045'], ['source' => '123.0454999999999', 'scale' => 3, 'result' => '123.045'], ['source' => '123.045499999999999', 'scale' => 3, 'result' => '123.045'], ['source' => '123.045499999999999999999', 'scale' => 3, 'result' => '123.045'], ['source' => '123.0455000', 'scale' => 3, 'result' => '123.046'], ['source' => '123.0456000', 'scale' => 3, 'result' => '123.046'], ['source' => '123.0456789', 'scale' => 3, 'result' => '123.046'], [], ['source' => '123.454000', 'scale' => 2, 'result' => '123.45'], ['source' => '123.454499', 'scale' => 2, 'result' => '123.45'], ['source' => '123.454500', 'scale' => 2, 'result' => '123.45'], ['source' => '123.454900', 'scale' => 2, 'result' => '123.45'], ['source' => '123.454999999999', 'scale' => 2, 'result' => '123.45'],// round() ok ['source' => '123.45499999999999', 'scale' => 2, 'result' => '123.45'],// round() ok (in php84+, not ok < 84) ['source' => '123.45499999999999999999', 'scale' => 2, 'result' => '123.45'],// round() not ok ['source' => '123.455000', 'scale' => 2, 'result' => '123.46'], ['source' => '123.456000', 'scale' => 2, 'result' => '123.46'], ['source' => '123.456789', 'scale' => 2, 'result' => '123.46'], [], ['source' => '123.54000', 'scale' => 1, 'result' => '123.5'], ['source' => '123.54499', 'scale' => 1, 'result' => '123.5'], ['source' => '123.54500', 'scale' => 1, 'result' => '123.5'], ['source' => '123.54900', 'scale' => 1, 'result' => '123.5'], ['source' => '123.54999999999', 'scale' => 1, 'result' => '123.5'], ['source' => '123.5499999999999', 'scale' => 1, 'result' => '123.5'], ['source' => '123.5499999999999999999', 'scale' => 1, 'result' => '123.5'], ['source' => '123.55000', 'scale' => 1, 'result' => '123.6'], ['source' => '123.56000', 'scale' => 1, 'result' => '123.6'], ['source' => '123.56789', 'scale' => 1, 'result' => '123.6'], [], ['source' => '123.4000', 'scale' => 0, 'result' => '123'], ['source' => '123.4499', 'scale' => 0, 'result' => '123'], ['source' => '123.4500', 'scale' => 0, 'result' => '123'], ['source' => '123.4900', 'scale' => 0, 'result' => '123'], ['source' => '123.4999999999', 'scale' => 0, 'result' => '123'], ['source' => '123.499999999999', 'scale' => 0, 'result' => '123'], ['source' => '123.499999999999999999', 'scale' => 0, 'result' => '123'], ['source' => '123.5000', 'scale' => 0, 'result' => '124'], ['source' => '123.6000', 'scale' => 0, 'result' => '124'], ['source' => '123.6789', 'scale' => 0, 'result' => '124'], ]; foreach ($testCases as $testCase) { if (count($testCase) === 0) { echo "\n"; continue; } $source = $testCase['source']; $scale = $testCase['scale']; $result = $testCase['result']; echo str_pad($source, 25) . ' => '; $output = []; // new function myBcRound $roundedNumber1 = myBcRound($source, $scale); $output['myBcRound'] = $roundedNumber1 . ' ' . ($roundedNumber1 === $result ? ' OK' : 'FAIL'); // PHP8.4 bcround (only if you run on git.master branch on 3v4l.org or local PHP8.4 version) $roundedNumber2 = ''; if (version_compare(PHP_VERSION, '8.4', '>=')) { $roundedNumber2 = bcround($source, $scale); } $output['bcround'] = $roundedNumber2 . ' ' . ($roundedNumber2 === $result ? ' OK' : 'FAIL'); // round(float) $roundedNumber3 = (string) round((float) $source, $scale); $output['round'] = $roundedNumber3 . ' ' . ($roundedNumber3 === $result ? ' OK' : 'FAIL'); foreach ($output as $key => $value) { echo $key . ' = ' . str_pad($value, 7) . ' '; } echo "\n"; }
Output for 8.4.1 - 8.4.14, 8.5.0
123.0454000 => myBcRound = 123.045 OK bcround = 123.045 OK round = 123.045 OK 123.0454499 => myBcRound = 123.045 OK bcround = 123.045 OK round = 123.045 OK 123.0454500 => myBcRound = 123.045 OK bcround = 123.045 OK round = 123.045 OK 123.0454900 => myBcRound = 123.045 OK bcround = 123.045 OK round = 123.045 OK 123.0454999999999 => myBcRound = 123.045 OK bcround = 123.045 OK round = 123.045 OK 123.045499999999999 => myBcRound = 123.045 OK bcround = 123.045 OK round = 123.046 FAIL 123.045499999999999999999 => myBcRound = 123.045 OK bcround = 123.045 OK round = 123.046 FAIL 123.0455000 => myBcRound = 123.046 OK bcround = 123.046 OK round = 123.046 OK 123.0456000 => myBcRound = 123.046 OK bcround = 123.046 OK round = 123.046 OK 123.0456789 => myBcRound = 123.046 OK bcround = 123.046 OK round = 123.046 OK 123.454000 => myBcRound = 123.45 OK bcround = 123.45 OK round = 123.45 OK 123.454499 => myBcRound = 123.45 OK bcround = 123.45 OK round = 123.45 OK 123.454500 => myBcRound = 123.45 OK bcround = 123.45 OK round = 123.45 OK 123.454900 => myBcRound = 123.45 OK bcround = 123.45 OK round = 123.45 OK 123.454999999999 => myBcRound = 123.45 OK bcround = 123.45 OK round = 123.45 OK 123.45499999999999 => myBcRound = 123.45 OK bcround = 123.45 OK round = 123.45 OK 123.45499999999999999999 => myBcRound = 123.45 OK bcround = 123.45 OK round = 123.46 FAIL 123.455000 => myBcRound = 123.46 OK bcround = 123.46 OK round = 123.46 OK 123.456000 => myBcRound = 123.46 OK bcround = 123.46 OK round = 123.46 OK 123.456789 => myBcRound = 123.46 OK bcround = 123.46 OK round = 123.46 OK 123.54000 => myBcRound = 123.5 OK bcround = 123.5 OK round = 123.5 OK 123.54499 => myBcRound = 123.5 OK bcround = 123.5 OK round = 123.5 OK 123.54500 => myBcRound = 123.5 OK bcround = 123.5 OK round = 123.5 OK 123.54900 => myBcRound = 123.5 OK bcround = 123.5 OK round = 123.5 OK 123.54999999999 => myBcRound = 123.5 OK bcround = 123.5 OK round = 123.5 OK 123.5499999999999 => myBcRound = 123.5 OK bcround = 123.5 OK round = 123.5 OK 123.5499999999999999999 => myBcRound = 123.5 OK bcround = 123.5 OK round = 123.6 FAIL 123.55000 => myBcRound = 123.6 OK bcround = 123.6 OK round = 123.6 OK 123.56000 => myBcRound = 123.6 OK bcround = 123.6 OK round = 123.6 OK 123.56789 => myBcRound = 123.6 OK bcround = 123.6 OK round = 123.6 OK 123.4000 => myBcRound = 123 OK bcround = 123 OK round = 123 OK 123.4499 => myBcRound = 123 OK bcround = 123 OK round = 123 OK 123.4500 => myBcRound = 123 OK bcround = 123 OK round = 123 OK 123.4900 => myBcRound = 123 OK bcround = 123 OK round = 123 OK 123.4999999999 => myBcRound = 123 OK bcround = 123 OK round = 123 OK 123.499999999999 => myBcRound = 123 OK bcround = 123 OK round = 123 OK 123.499999999999999999 => myBcRound = 123 OK bcround = 123 OK round = 124 FAIL 123.5000 => myBcRound = 124 OK bcround = 124 OK round = 124 OK 123.6000 => myBcRound = 124 OK bcround = 124 OK round = 124 OK 123.6789 => myBcRound = 124 OK bcround = 124 OK round = 124 OK
Output for 8.4.15
/bin/php-8.4.15: /usr/lib/libm.so.6: version `GLIBC_2.38' not found (required by /bin/php-8.4.15) /bin/php-8.4.15: /usr/lib/libm.so.6: version `GLIBC_2.35' not found (required by /bin/php-8.4.15) /bin/php-8.4.15: /usr/lib/libc.so.6: version `GLIBC_2.34' not found (required by /bin/php-8.4.15) /bin/php-8.4.15: /usr/lib/libc.so.6: version `GLIBC_2.38' not found (required by /bin/php-8.4.15)
Process exited with code 1.
Output for 8.1.31 - 8.1.33, 8.2.25 - 8.2.29, 8.3.5 - 8.3.28
123.0454000 => myBcRound = 123.045 OK bcround = FAIL round = 123.045 OK 123.0454499 => myBcRound = 123.045 OK bcround = FAIL round = 123.045 OK 123.0454500 => myBcRound = 123.045 OK bcround = FAIL round = 123.045 OK 123.0454900 => myBcRound = 123.045 OK bcround = FAIL round = 123.045 OK 123.0454999999999 => myBcRound = 123.045 OK bcround = FAIL round = 123.046 FAIL 123.045499999999999 => myBcRound = 123.045 OK bcround = FAIL round = 123.046 FAIL 123.045499999999999999999 => myBcRound = 123.045 OK bcround = FAIL round = 123.046 FAIL 123.0455000 => myBcRound = 123.046 OK bcround = FAIL round = 123.046 OK 123.0456000 => myBcRound = 123.046 OK bcround = FAIL round = 123.046 OK 123.0456789 => myBcRound = 123.046 OK bcround = FAIL round = 123.046 OK 123.454000 => myBcRound = 123.45 OK bcround = FAIL round = 123.45 OK 123.454499 => myBcRound = 123.45 OK bcround = FAIL round = 123.45 OK 123.454500 => myBcRound = 123.45 OK bcround = FAIL round = 123.45 OK 123.454900 => myBcRound = 123.45 OK bcround = FAIL round = 123.45 OK 123.454999999999 => myBcRound = 123.45 OK bcround = FAIL round = 123.45 OK 123.45499999999999 => myBcRound = 123.45 OK bcround = FAIL round = 123.46 FAIL 123.45499999999999999999 => myBcRound = 123.45 OK bcround = FAIL round = 123.46 FAIL 123.455000 => myBcRound = 123.46 OK bcround = FAIL round = 123.46 OK 123.456000 => myBcRound = 123.46 OK bcround = FAIL round = 123.46 OK 123.456789 => myBcRound = 123.46 OK bcround = FAIL round = 123.46 OK 123.54000 => myBcRound = 123.5 OK bcround = FAIL round = 123.5 OK 123.54499 => myBcRound = 123.5 OK bcround = FAIL round = 123.5 OK 123.54500 => myBcRound = 123.5 OK bcround = FAIL round = 123.5 OK 123.54900 => myBcRound = 123.5 OK bcround = FAIL round = 123.5 OK 123.54999999999 => myBcRound = 123.5 OK bcround = FAIL round = 123.5 OK 123.5499999999999 => myBcRound = 123.5 OK bcround = FAIL round = 123.6 FAIL 123.5499999999999999999 => myBcRound = 123.5 OK bcround = FAIL round = 123.6 FAIL 123.55000 => myBcRound = 123.6 OK bcround = FAIL round = 123.6 OK 123.56000 => myBcRound = 123.6 OK bcround = FAIL round = 123.6 OK 123.56789 => myBcRound = 123.6 OK bcround = FAIL round = 123.6 OK 123.4000 => myBcRound = 123 OK bcround = FAIL round = 123 OK 123.4499 => myBcRound = 123 OK bcround = FAIL round = 123 OK 123.4500 => myBcRound = 123 OK bcround = FAIL round = 123 OK 123.4900 => myBcRound = 123 OK bcround = FAIL round = 123 OK 123.4999999999 => myBcRound = 123 OK bcround = FAIL round = 123 OK 123.499999999999 => myBcRound = 123 OK bcround = FAIL round = 123 OK 123.499999999999999999 => myBcRound = 123 OK bcround = FAIL round = 124 FAIL 123.5000 => myBcRound = 124 OK bcround = FAIL round = 124 OK 123.6000 => myBcRound = 124 OK bcround = FAIL round = 124 OK 123.6789 => myBcRound = 124 OK bcround = FAIL round = 124 OK

preferences:
65.13 ms | 424 KiB | 5 Q