Skip to content

Commit 6e9ade7

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

File tree

2 files changed

+163
-1
lines changed

2 files changed

+163
-1
lines changed

ext/standard/math.c

Lines changed: 1 addition & 1 deletion
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

Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
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+
[4503599627370495.5, 0],
17+
[-4503599627370495.5, 0],
18+
],
19+
'PHP_ROUND_HALF_DOWN' => [
20+
[0.12345678901234565, 16],
21+
[-0.12345678901234565, 16],
22+
[12345678901234565, -1],
23+
[-12345678901234565, -1],
24+
[0.000000012345678901234535, 23],
25+
[-0.000000012345678901234535, 23],
26+
[4503599627370495.5, 0],
27+
[-4503599627370495.5, 0],
28+
],
29+
'PHP_ROUND_HALF_EVEN' => [
30+
[0.12345678901234565, 16],
31+
[-0.12345678901234565, 16],
32+
[12345678901234565, -1],
33+
[-12345678901234565, -1],
34+
[0.000000012345678901234535, 23],
35+
[-0.000000012345678901234535, 23],
36+
[4503599627370495.5, 0],
37+
[-4503599627370495.5, 0],
38+
],
39+
'PHP_ROUND_HALF_ODD' => [
40+
[0.12345678901234565, 16],
41+
[-0.12345678901234565, 16],
42+
[12345678901234565, -1],
43+
[-12345678901234565, -1],
44+
[0.000000012345678901234535, 23],
45+
[-0.000000012345678901234535, 23],
46+
[4503599627370495.5, 0],
47+
[-4503599627370495.5, 0],
48+
],
49+
'PHP_ROUND_AWAY_FROM_ZERO' => [
50+
[0.12345678901234560, 16],
51+
[-0.12345678901234560, 16],
52+
[12345678901234567, -1],
53+
[-12345678901234567, -1],
54+
[0.000000012345678901234531, 23],
55+
[-0.000000012345678901234531, 23],
56+
[4503599627370495.5, 0],
57+
[-4503599627370495.5, 0],
58+
],
59+
'PHP_ROUND_TOWARD_ZERO' => [
60+
[0.12345678901234566, 16],
61+
[-0.12345678901234566, 16],
62+
[12345678901234565, -1],
63+
[-12345678901234565, -1],
64+
[0.000000012345678901234531, 23],
65+
[-0.000000012345678901234531, 23],
66+
[4503599627370495.5, 0],
67+
[-4503599627370495.5, 0],
68+
],
69+
'PHP_ROUND_CEILING' => [
70+
[0.12345678901234560, 16],
71+
[-0.12345678901234560, 16],
72+
[12345678901234564, -1],
73+
[-12345678901234564, -1],
74+
[0.000000012345678901234531, 23],
75+
[-0.000000012345678901234531, 23],
76+
[4503599627370495.5, 0],
77+
[-4503599627370495.5, 0],
78+
],
79+
'PHP_ROUND_FLOOR' => [
80+
[0.12345678901234560, 16],
81+
[-0.12345678901234560, 16],
82+
[12345678901234564, -1],
83+
[-12345678901234564, -1],
84+
[0.000000012345678901234531, 23],
85+
[-0.000000012345678901234531, 23],
86+
[4503599627370495.5, 0],
87+
[-4503599627370495.5, 0],
88+
],
89+
];
90+
91+
foreach ($testCases as $mode => $cases) {
92+
echo "========== {$mode} ==========\n";
93+
foreach ($cases as [$val, $precision]) {
94+
var_dump(round($val, $precision, constant($mode)));
95+
}
96+
echo "\n";
97+
}
98+
?>
99+
--EXPECT--
100+
========== PHP_ROUND_HALF_UP ==========
101+
float(0.1234567890123457)
102+
float(-0.1234567890123457)
103+
float(12345678901234570)
104+
float(-12345678901234570)
105+
float(1.234567890123454E-8)
106+
float(-1.234567890123454E-8)
107+
108+
========== PHP_ROUND_HALF_DOWN ==========
109+
float(0.1234567890123456)
110+
float(-0.1234567890123456)
111+
float(12345678901234560)
112+
float(-12345678901234560)
113+
float(1.234567890123453E-8)
114+
float(-1.234567890123453E-8)
115+
116+
========== PHP_ROUND_HALF_EVEN ==========
117+
float(0.1234567890123456)
118+
float(-0.1234567890123456)
119+
float(12345678901234560)
120+
float(-12345678901234560)
121+
float(1.234567890123454E-8)
122+
float(-1.234567890123454E-8)
123+
124+
========== PHP_ROUND_HALF_ODD ==========
125+
float(0.1234567890123457)
126+
float(-0.1234567890123457)
127+
float(12345678901234570)
128+
float(-12345678901234570)
129+
float(1.234567890123453E-8)
130+
float(-1.234567890123453E-8)
131+
132+
========== PHP_ROUND_AWAY_FROM_ZERO ==========
133+
float(0.1234567890123456)
134+
float(-0.1234567890123456)
135+
float(12345678901234570)
136+
float(-12345678901234570)
137+
float(1.234567890123454E-8)
138+
float(-1.234567890123454E-8)
139+
140+
========== PHP_ROUND_TOWARD_ZERO ==========
141+
float(0.1234567890123456)
142+
float(-0.1234567890123456)
143+
float(12345678901234560)
144+
float(-12345678901234560)
145+
float(1.234567890123453E-8)
146+
float(-1.234567890123453E-8)
147+
148+
========== PHP_ROUND_CEILING ==========
149+
float(0.1234567890123456)
150+
float(-0.1234567890123456)
151+
float(12345678901234570)
152+
float(-12345678901234560)
153+
float(1.234567890123454E-8)
154+
float(-1.234567890123453E-8)
155+
156+
========== PHP_ROUND_FLOOR ==========
157+
float(0.1234567890123456)
158+
float(-0.1234567890123456)
159+
float(12345678901234560)
160+
float(-12345678901234570)
161+
float(1.234567890123453E-8)
162+
float(-1.234567890123454E-8)

0 commit comments

Comments
 (0)