Skip to content

Commit 31304be

Browse files
committed
Extend the maximum precision round can handle by one digit
1 parent b558a18 commit 31304be

File tree

2 files changed

+147
-1
lines changed

2 files changed

+147
-1
lines changed

ext/standard/math.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ PHPAPI double _php_math_round(double value, int places, int mode) {
199199
fesetround(cpu_round_mode);
200200

201201
/* This value is beyond our precision, so rounding it is pointless */
202-
if (fabs(tmp_value) >= 1e15) {
202+
if (fabs(tmp_value) >= 1e16) {
203203
return value;
204204
}
205205

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
--TEST--
2+
Feature GH-12143: Extend the maximum precision round can handle by one digit
3+
--INI--
4+
serialize_precisiion=17
5+
--FILE--
6+
<?php
7+
8+
$testCases = [
9+
'PHP_ROUND_HALF_UP' => [
10+
[0.12345678901234565, 16],
11+
[-0.12345678901234565, 16],
12+
[12345678901234565, -1],
13+
[-12345678901234565, -1],
14+
[0.000000012345678901234535, 23],
15+
[-0.000000012345678901234535, 23],
16+
],
17+
'PHP_ROUND_HALF_DOWN' => [
18+
[0.12345678901234565, 16],
19+
[-0.12345678901234565, 16],
20+
[12345678901234565, -1],
21+
[-12345678901234565, -1],
22+
[0.000000012345678901234535, 23],
23+
[-0.000000012345678901234535, 23],
24+
],
25+
'PHP_ROUND_HALF_EVEN' => [
26+
[0.12345678901234565, 16],
27+
[-0.12345678901234565, 16],
28+
[12345678901234565, -1],
29+
[-12345678901234565, -1],
30+
[0.000000012345678901234535, 23],
31+
[-0.000000012345678901234535, 23],
32+
],
33+
'PHP_ROUND_HALF_ODD' => [
34+
[0.12345678901234565, 16],
35+
[-0.12345678901234565, 16],
36+
[12345678901234565, -1],
37+
[-12345678901234565, -1],
38+
[0.000000012345678901234535, 23],
39+
[-0.000000012345678901234535, 23],
40+
],
41+
'PHP_ROUND_AWAY_FROM_ZERO' => [
42+
[0.12345678901234560, 16],
43+
[-0.12345678901234560, 16],
44+
[12345678901234567, -1],
45+
[-12345678901234567, -1],
46+
[0.000000012345678901234531, 23],
47+
[-0.000000012345678901234531, 23],
48+
],
49+
'PHP_ROUND_TOWARD_ZERO' => [
50+
[0.12345678901234566, 16],
51+
[-0.12345678901234566, 16],
52+
[12345678901234565, -1],
53+
[-12345678901234565, -1],
54+
[0.000000012345678901234531, 23],
55+
[-0.000000012345678901234531, 23],
56+
],
57+
'PHP_ROUND_CEILING' => [
58+
[0.12345678901234560, 16],
59+
[-0.12345678901234560, 16],
60+
[12345678901234564, -1],
61+
[-12345678901234564, -1],
62+
[0.000000012345678901234531, 23],
63+
[-0.000000012345678901234531, 23],
64+
],
65+
'PHP_ROUND_FLOOR' => [
66+
[0.12345678901234560, 16],
67+
[-0.12345678901234560, 16],
68+
[12345678901234564, -1],
69+
[-12345678901234564, -1],
70+
[0.000000012345678901234531, 23],
71+
[-0.000000012345678901234531, 23],
72+
],
73+
];
74+
75+
foreach ($testCases as $mode => $cases) {
76+
echo "========== {$mode} ==========\n";
77+
foreach ($cases as [$val, $precision]) {
78+
var_dump(round($val, $precision, constant($mode)));
79+
}
80+
echo "\n";
81+
}
82+
?>
83+
--EXPECT--
84+
========== PHP_ROUND_HALF_UP ==========
85+
float(0.1234567890123457)
86+
float(-0.1234567890123457)
87+
float(12345678901234570)
88+
float(-12345678901234570)
89+
float(1.234567890123454E-8)
90+
float(-1.234567890123454E-8)
91+
92+
========== PHP_ROUND_HALF_DOWN ==========
93+
float(0.1234567890123456)
94+
float(-0.1234567890123456)
95+
float(12345678901234560)
96+
float(-12345678901234560)
97+
float(1.234567890123453E-8)
98+
float(-1.234567890123453E-8)
99+
100+
========== PHP_ROUND_HALF_EVEN ==========
101+
float(0.1234567890123456)
102+
float(-0.1234567890123456)
103+
float(12345678901234560)
104+
float(-12345678901234560)
105+
float(1.234567890123454E-8)
106+
float(-1.234567890123454E-8)
107+
108+
========== PHP_ROUND_HALF_ODD ==========
109+
float(0.1234567890123457)
110+
float(-0.1234567890123457)
111+
float(12345678901234570)
112+
float(-12345678901234570)
113+
float(1.234567890123453E-8)
114+
float(-1.234567890123453E-8)
115+
116+
========== PHP_ROUND_AWAY_FROM_ZERO ==========
117+
float(0.1234567890123456)
118+
float(-0.1234567890123456)
119+
float(12345678901234570)
120+
float(-12345678901234570)
121+
float(1.234567890123454E-8)
122+
float(-1.234567890123454E-8)
123+
124+
========== PHP_ROUND_TOWARD_ZERO ==========
125+
float(0.1234567890123456)
126+
float(-0.1234567890123456)
127+
float(12345678901234560)
128+
float(-12345678901234560)
129+
float(1.234567890123453E-8)
130+
float(-1.234567890123453E-8)
131+
132+
========== PHP_ROUND_CEILING ==========
133+
float(0.1234567890123456)
134+
float(-0.1234567890123456)
135+
float(12345678901234570)
136+
float(-12345678901234560)
137+
float(1.234567890123454E-8)
138+
float(-1.234567890123453E-8)
139+
140+
========== PHP_ROUND_FLOOR ==========
141+
float(0.1234567890123456)
142+
float(-0.1234567890123456)
143+
float(12345678901234560)
144+
float(-12345678901234570)
145+
float(1.234567890123453E-8)
146+
float(-1.234567890123454E-8)

0 commit comments

Comments
 (0)