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"; }

Here you find the average performance (time & memory) of each version. A grayed out version indicates it didn't complete successfully (based on exit-code).

VersionSystem time (s)User time (s)Memory (MiB)
8.5.00.0100.01220.16
8.4.150.0010.00014.05
8.4.140.0150.01517.66
8.4.130.0150.00617.86
8.4.120.0130.00820.54
8.4.110.0110.01017.91
8.4.100.0120.00917.71
8.4.90.0130.00820.56
8.4.80.0110.00718.97
8.4.70.0050.00418.66
8.4.60.0130.00822.25
8.4.50.0060.00320.39
8.4.40.0200.00017.54
8.4.30.0030.00618.93
8.4.20.0100.01021.27
8.4.10.0090.00019.39
8.3.280.0110.01118.51
8.3.270.0100.01016.36
8.3.260.0050.00316.69
8.3.250.0110.00916.62
8.3.240.0130.00616.39
8.3.230.0130.00818.38
8.3.220.0050.01418.88
8.3.210.0100.01016.73
8.3.200.0050.00516.65
8.3.190.0050.00817.05
8.3.180.0120.00718.75
8.3.170.0070.01317.10
8.3.160.0090.00618.67
8.3.150.0000.01817.20
8.3.140.0080.00316.89
8.3.130.0030.00618.32
8.3.120.0060.00316.77
8.3.50.0030.00616.86
8.2.290.0050.00418.34
8.2.280.0140.00618.39
8.2.270.0130.00616.56
8.2.260.0000.01516.96
8.2.250.0090.00018.48
8.1.330.0130.00616.46
8.1.320.0050.00516.39
8.1.310.0100.01016.18

preferences:
64.36 ms | 403 KiB | 5 Q