1--TEST--
2round() with different rounding modes
3--FILE--
4<?php
5$modes = [
6    "PHP_ROUND_HALF_UP" => PHP_ROUND_HALF_UP,
7    "PHP_ROUND_HALF_DOWN" => PHP_ROUND_HALF_DOWN,
8    "PHP_ROUND_HALF_EVEN" => PHP_ROUND_HALF_EVEN,
9    "PHP_ROUND_HALF_ODD" => PHP_ROUND_HALF_ODD,
10    "PHP_ROUND_CEILING" => PHP_ROUND_CEILING,
11    "PHP_ROUND_FLOOR" => PHP_ROUND_FLOOR,
12    "PHP_ROUND_TOWARD_ZERO" => PHP_ROUND_TOWARD_ZERO,
13    "PHP_ROUND_AWAY_FROM_ZERO" => PHP_ROUND_AWAY_FROM_ZERO,
14];
15
16$numbers = [
17    2.5,
18    -2.5,
19    3.5,
20    -3.5,
21    7,
22    -7,
23    15.51,
24    -15.51,
25    5,
26    -5,
27    0.61,
28    0.69,
29    0.65,
30    -0.65,
31    1.9999,
32    -1.9999,
33    0.0001,
34    -0.0001,
35];
36$precisions = [-1, 0, 1, 2, 10];
37
38foreach ($modes as $modeKey => $mode) {
39    echo "mode: $modeKey\n";
40    foreach ($precisions as $precision) {
41        echo "\tprecision: $precision\n";
42        foreach ($numbers as $number) {
43            $result = round($number, $precision, $mode);
44            echo "\t\t" .
45                str_pad($number, 7, " ", STR_PAD_LEFT) .
46                " => $result\n";
47        }
48        echo "\n";
49    }
50}
51
52?>
53--EXPECT--
54mode: PHP_ROUND_HALF_UP
55	precision: -1
56		    2.5 => 0
57		   -2.5 => -0
58		    3.5 => 0
59		   -3.5 => -0
60		      7 => 10
61		     -7 => -10
62		  15.51 => 20
63		 -15.51 => -20
64		      5 => 10
65		     -5 => -10
66		   0.61 => 0
67		   0.69 => 0
68		   0.65 => 0
69		  -0.65 => -0
70		 1.9999 => 0
71		-1.9999 => -0
72		 0.0001 => 0
73		-0.0001 => -0
74
75	precision: 0
76		    2.5 => 3
77		   -2.5 => -3
78		    3.5 => 4
79		   -3.5 => -4
80		      7 => 7
81		     -7 => -7
82		  15.51 => 16
83		 -15.51 => -16
84		      5 => 5
85		     -5 => -5
86		   0.61 => 1
87		   0.69 => 1
88		   0.65 => 1
89		  -0.65 => -1
90		 1.9999 => 2
91		-1.9999 => -2
92		 0.0001 => 0
93		-0.0001 => -0
94
95	precision: 1
96		    2.5 => 2.5
97		   -2.5 => -2.5
98		    3.5 => 3.5
99		   -3.5 => -3.5
100		      7 => 7
101		     -7 => -7
102		  15.51 => 15.5
103		 -15.51 => -15.5
104		      5 => 5
105		     -5 => -5
106		   0.61 => 0.6
107		   0.69 => 0.7
108		   0.65 => 0.7
109		  -0.65 => -0.7
110		 1.9999 => 2
111		-1.9999 => -2
112		 0.0001 => 0
113		-0.0001 => -0
114
115	precision: 2
116		    2.5 => 2.5
117		   -2.5 => -2.5
118		    3.5 => 3.5
119		   -3.5 => -3.5
120		      7 => 7
121		     -7 => -7
122		  15.51 => 15.51
123		 -15.51 => -15.51
124		      5 => 5
125		     -5 => -5
126		   0.61 => 0.61
127		   0.69 => 0.69
128		   0.65 => 0.65
129		  -0.65 => -0.65
130		 1.9999 => 2
131		-1.9999 => -2
132		 0.0001 => 0
133		-0.0001 => -0
134
135	precision: 10
136		    2.5 => 2.5
137		   -2.5 => -2.5
138		    3.5 => 3.5
139		   -3.5 => -3.5
140		      7 => 7
141		     -7 => -7
142		  15.51 => 15.51
143		 -15.51 => -15.51
144		      5 => 5
145		     -5 => -5
146		   0.61 => 0.61
147		   0.69 => 0.69
148		   0.65 => 0.65
149		  -0.65 => -0.65
150		 1.9999 => 1.9999
151		-1.9999 => -1.9999
152		 0.0001 => 0.0001
153		-0.0001 => -0.0001
154
155mode: PHP_ROUND_HALF_DOWN
156	precision: -1
157		    2.5 => 0
158		   -2.5 => -0
159		    3.5 => 0
160		   -3.5 => -0
161		      7 => 10
162		     -7 => -10
163		  15.51 => 20
164		 -15.51 => -20
165		      5 => 0
166		     -5 => -0
167		   0.61 => 0
168		   0.69 => 0
169		   0.65 => 0
170		  -0.65 => -0
171		 1.9999 => 0
172		-1.9999 => -0
173		 0.0001 => 0
174		-0.0001 => -0
175
176	precision: 0
177		    2.5 => 2
178		   -2.5 => -2
179		    3.5 => 3
180		   -3.5 => -3
181		      7 => 7
182		     -7 => -7
183		  15.51 => 16
184		 -15.51 => -16
185		      5 => 5
186		     -5 => -5
187		   0.61 => 1
188		   0.69 => 1
189		   0.65 => 1
190		  -0.65 => -1
191		 1.9999 => 2
192		-1.9999 => -2
193		 0.0001 => 0
194		-0.0001 => -0
195
196	precision: 1
197		    2.5 => 2.5
198		   -2.5 => -2.5
199		    3.5 => 3.5
200		   -3.5 => -3.5
201		      7 => 7
202		     -7 => -7
203		  15.51 => 15.5
204		 -15.51 => -15.5
205		      5 => 5
206		     -5 => -5
207		   0.61 => 0.6
208		   0.69 => 0.7
209		   0.65 => 0.6
210		  -0.65 => -0.6
211		 1.9999 => 2
212		-1.9999 => -2
213		 0.0001 => 0
214		-0.0001 => -0
215
216	precision: 2
217		    2.5 => 2.5
218		   -2.5 => -2.5
219		    3.5 => 3.5
220		   -3.5 => -3.5
221		      7 => 7
222		     -7 => -7
223		  15.51 => 15.51
224		 -15.51 => -15.51
225		      5 => 5
226		     -5 => -5
227		   0.61 => 0.61
228		   0.69 => 0.69
229		   0.65 => 0.65
230		  -0.65 => -0.65
231		 1.9999 => 2
232		-1.9999 => -2
233		 0.0001 => 0
234		-0.0001 => -0
235
236	precision: 10
237		    2.5 => 2.5
238		   -2.5 => -2.5
239		    3.5 => 3.5
240		   -3.5 => -3.5
241		      7 => 7
242		     -7 => -7
243		  15.51 => 15.51
244		 -15.51 => -15.51
245		      5 => 5
246		     -5 => -5
247		   0.61 => 0.61
248		   0.69 => 0.69
249		   0.65 => 0.65
250		  -0.65 => -0.65
251		 1.9999 => 1.9999
252		-1.9999 => -1.9999
253		 0.0001 => 0.0001
254		-0.0001 => -0.0001
255
256mode: PHP_ROUND_HALF_EVEN
257	precision: -1
258		    2.5 => 0
259		   -2.5 => -0
260		    3.5 => 0
261		   -3.5 => -0
262		      7 => 10
263		     -7 => -10
264		  15.51 => 20
265		 -15.51 => -20
266		      5 => 0
267		     -5 => -0
268		   0.61 => 0
269		   0.69 => 0
270		   0.65 => 0
271		  -0.65 => -0
272		 1.9999 => 0
273		-1.9999 => -0
274		 0.0001 => 0
275		-0.0001 => -0
276
277	precision: 0
278		    2.5 => 2
279		   -2.5 => -2
280		    3.5 => 4
281		   -3.5 => -4
282		      7 => 7
283		     -7 => -7
284		  15.51 => 16
285		 -15.51 => -16
286		      5 => 5
287		     -5 => -5
288		   0.61 => 1
289		   0.69 => 1
290		   0.65 => 1
291		  -0.65 => -1
292		 1.9999 => 2
293		-1.9999 => -2
294		 0.0001 => 0
295		-0.0001 => -0
296
297	precision: 1
298		    2.5 => 2.5
299		   -2.5 => -2.5
300		    3.5 => 3.5
301		   -3.5 => -3.5
302		      7 => 7
303		     -7 => -7
304		  15.51 => 15.5
305		 -15.51 => -15.5
306		      5 => 5
307		     -5 => -5
308		   0.61 => 0.6
309		   0.69 => 0.7
310		   0.65 => 0.6
311		  -0.65 => -0.6
312		 1.9999 => 2
313		-1.9999 => -2
314		 0.0001 => 0
315		-0.0001 => -0
316
317	precision: 2
318		    2.5 => 2.5
319		   -2.5 => -2.5
320		    3.5 => 3.5
321		   -3.5 => -3.5
322		      7 => 7
323		     -7 => -7
324		  15.51 => 15.51
325		 -15.51 => -15.51
326		      5 => 5
327		     -5 => -5
328		   0.61 => 0.61
329		   0.69 => 0.69
330		   0.65 => 0.65
331		  -0.65 => -0.65
332		 1.9999 => 2
333		-1.9999 => -2
334		 0.0001 => 0
335		-0.0001 => -0
336
337	precision: 10
338		    2.5 => 2.5
339		   -2.5 => -2.5
340		    3.5 => 3.5
341		   -3.5 => -3.5
342		      7 => 7
343		     -7 => -7
344		  15.51 => 15.51
345		 -15.51 => -15.51
346		      5 => 5
347		     -5 => -5
348		   0.61 => 0.61
349		   0.69 => 0.69
350		   0.65 => 0.65
351		  -0.65 => -0.65
352		 1.9999 => 1.9999
353		-1.9999 => -1.9999
354		 0.0001 => 0.0001
355		-0.0001 => -0.0001
356
357mode: PHP_ROUND_HALF_ODD
358	precision: -1
359		    2.5 => 0
360		   -2.5 => -0
361		    3.5 => 0
362		   -3.5 => -0
363		      7 => 10
364		     -7 => -10
365		  15.51 => 20
366		 -15.51 => -20
367		      5 => 10
368		     -5 => -10
369		   0.61 => 0
370		   0.69 => 0
371		   0.65 => 0
372		  -0.65 => -0
373		 1.9999 => 0
374		-1.9999 => -0
375		 0.0001 => 0
376		-0.0001 => -0
377
378	precision: 0
379		    2.5 => 3
380		   -2.5 => -3
381		    3.5 => 3
382		   -3.5 => -3
383		      7 => 7
384		     -7 => -7
385		  15.51 => 16
386		 -15.51 => -16
387		      5 => 5
388		     -5 => -5
389		   0.61 => 1
390		   0.69 => 1
391		   0.65 => 1
392		  -0.65 => -1
393		 1.9999 => 2
394		-1.9999 => -2
395		 0.0001 => 0
396		-0.0001 => -0
397
398	precision: 1
399		    2.5 => 2.5
400		   -2.5 => -2.5
401		    3.5 => 3.5
402		   -3.5 => -3.5
403		      7 => 7
404		     -7 => -7
405		  15.51 => 15.5
406		 -15.51 => -15.5
407		      5 => 5
408		     -5 => -5
409		   0.61 => 0.6
410		   0.69 => 0.7
411		   0.65 => 0.7
412		  -0.65 => -0.7
413		 1.9999 => 2
414		-1.9999 => -2
415		 0.0001 => 0
416		-0.0001 => -0
417
418	precision: 2
419		    2.5 => 2.5
420		   -2.5 => -2.5
421		    3.5 => 3.5
422		   -3.5 => -3.5
423		      7 => 7
424		     -7 => -7
425		  15.51 => 15.51
426		 -15.51 => -15.51
427		      5 => 5
428		     -5 => -5
429		   0.61 => 0.61
430		   0.69 => 0.69
431		   0.65 => 0.65
432		  -0.65 => -0.65
433		 1.9999 => 2
434		-1.9999 => -2
435		 0.0001 => 0
436		-0.0001 => -0
437
438	precision: 10
439		    2.5 => 2.5
440		   -2.5 => -2.5
441		    3.5 => 3.5
442		   -3.5 => -3.5
443		      7 => 7
444		     -7 => -7
445		  15.51 => 15.51
446		 -15.51 => -15.51
447		      5 => 5
448		     -5 => -5
449		   0.61 => 0.61
450		   0.69 => 0.69
451		   0.65 => 0.65
452		  -0.65 => -0.65
453		 1.9999 => 1.9999
454		-1.9999 => -1.9999
455		 0.0001 => 0.0001
456		-0.0001 => -0.0001
457
458mode: PHP_ROUND_CEILING
459	precision: -1
460		    2.5 => 10
461		   -2.5 => -0
462		    3.5 => 10
463		   -3.5 => -0
464		      7 => 10
465		     -7 => -0
466		  15.51 => 20
467		 -15.51 => -10
468		      5 => 10
469		     -5 => -0
470		   0.61 => 10
471		   0.69 => 10
472		   0.65 => 10
473		  -0.65 => -0
474		 1.9999 => 10
475		-1.9999 => -0
476		 0.0001 => 10
477		-0.0001 => -0
478
479	precision: 0
480		    2.5 => 3
481		   -2.5 => -2
482		    3.5 => 4
483		   -3.5 => -3
484		      7 => 7
485		     -7 => -7
486		  15.51 => 16
487		 -15.51 => -15
488		      5 => 5
489		     -5 => -5
490		   0.61 => 1
491		   0.69 => 1
492		   0.65 => 1
493		  -0.65 => -0
494		 1.9999 => 2
495		-1.9999 => -1
496		 0.0001 => 1
497		-0.0001 => -0
498
499	precision: 1
500		    2.5 => 2.5
501		   -2.5 => -2.5
502		    3.5 => 3.5
503		   -3.5 => -3.5
504		      7 => 7
505		     -7 => -7
506		  15.51 => 15.6
507		 -15.51 => -15.5
508		      5 => 5
509		     -5 => -5
510		   0.61 => 0.7
511		   0.69 => 0.7
512		   0.65 => 0.7
513		  -0.65 => -0.6
514		 1.9999 => 2
515		-1.9999 => -1.9
516		 0.0001 => 0.1
517		-0.0001 => -0
518
519	precision: 2
520		    2.5 => 2.5
521		   -2.5 => -2.5
522		    3.5 => 3.5
523		   -3.5 => -3.5
524		      7 => 7
525		     -7 => -7
526		  15.51 => 15.51
527		 -15.51 => -15.51
528		      5 => 5
529		     -5 => -5
530		   0.61 => 0.61
531		   0.69 => 0.69
532		   0.65 => 0.65
533		  -0.65 => -0.65
534		 1.9999 => 2
535		-1.9999 => -1.99
536		 0.0001 => 0.01
537		-0.0001 => -0
538
539	precision: 10
540		    2.5 => 2.5
541		   -2.5 => -2.5
542		    3.5 => 3.5
543		   -3.5 => -3.5
544		      7 => 7
545		     -7 => -7
546		  15.51 => 15.51
547		 -15.51 => -15.51
548		      5 => 5
549		     -5 => -5
550		   0.61 => 0.61
551		   0.69 => 0.69
552		   0.65 => 0.65
553		  -0.65 => -0.65
554		 1.9999 => 1.9999
555		-1.9999 => -1.9999
556		 0.0001 => 0.0001
557		-0.0001 => -0.0001
558
559mode: PHP_ROUND_FLOOR
560	precision: -1
561		    2.5 => 0
562		   -2.5 => -10
563		    3.5 => 0
564		   -3.5 => -10
565		      7 => 0
566		     -7 => -10
567		  15.51 => 10
568		 -15.51 => -20
569		      5 => 0
570		     -5 => -10
571		   0.61 => 0
572		   0.69 => 0
573		   0.65 => 0
574		  -0.65 => -10
575		 1.9999 => 0
576		-1.9999 => -10
577		 0.0001 => 0
578		-0.0001 => -10
579
580	precision: 0
581		    2.5 => 2
582		   -2.5 => -3
583		    3.5 => 3
584		   -3.5 => -4
585		      7 => 7
586		     -7 => -7
587		  15.51 => 15
588		 -15.51 => -16
589		      5 => 5
590		     -5 => -5
591		   0.61 => 0
592		   0.69 => 0
593		   0.65 => 0
594		  -0.65 => -1
595		 1.9999 => 1
596		-1.9999 => -2
597		 0.0001 => 0
598		-0.0001 => -1
599
600	precision: 1
601		    2.5 => 2.5
602		   -2.5 => -2.5
603		    3.5 => 3.5
604		   -3.5 => -3.5
605		      7 => 7
606		     -7 => -7
607		  15.51 => 15.5
608		 -15.51 => -15.6
609		      5 => 5
610		     -5 => -5
611		   0.61 => 0.6
612		   0.69 => 0.6
613		   0.65 => 0.6
614		  -0.65 => -0.7
615		 1.9999 => 1.9
616		-1.9999 => -2
617		 0.0001 => 0
618		-0.0001 => -0.1
619
620	precision: 2
621		    2.5 => 2.5
622		   -2.5 => -2.5
623		    3.5 => 3.5
624		   -3.5 => -3.5
625		      7 => 7
626		     -7 => -7
627		  15.51 => 15.51
628		 -15.51 => -15.51
629		      5 => 5
630		     -5 => -5
631		   0.61 => 0.61
632		   0.69 => 0.69
633		   0.65 => 0.65
634		  -0.65 => -0.65
635		 1.9999 => 1.99
636		-1.9999 => -2
637		 0.0001 => 0
638		-0.0001 => -0.01
639
640	precision: 10
641		    2.5 => 2.5
642		   -2.5 => -2.5
643		    3.5 => 3.5
644		   -3.5 => -3.5
645		      7 => 7
646		     -7 => -7
647		  15.51 => 15.51
648		 -15.51 => -15.51
649		      5 => 5
650		     -5 => -5
651		   0.61 => 0.61
652		   0.69 => 0.69
653		   0.65 => 0.65
654		  -0.65 => -0.65
655		 1.9999 => 1.9999
656		-1.9999 => -1.9999
657		 0.0001 => 0.0001
658		-0.0001 => -0.0001
659
660mode: PHP_ROUND_TOWARD_ZERO
661	precision: -1
662		    2.5 => 0
663		   -2.5 => -0
664		    3.5 => 0
665		   -3.5 => -0
666		      7 => 0
667		     -7 => -0
668		  15.51 => 10
669		 -15.51 => -10
670		      5 => 0
671		     -5 => -0
672		   0.61 => 0
673		   0.69 => 0
674		   0.65 => 0
675		  -0.65 => -0
676		 1.9999 => 0
677		-1.9999 => -0
678		 0.0001 => 0
679		-0.0001 => -0
680
681	precision: 0
682		    2.5 => 2
683		   -2.5 => -2
684		    3.5 => 3
685		   -3.5 => -3
686		      7 => 7
687		     -7 => -7
688		  15.51 => 15
689		 -15.51 => -15
690		      5 => 5
691		     -5 => -5
692		   0.61 => 0
693		   0.69 => 0
694		   0.65 => 0
695		  -0.65 => -0
696		 1.9999 => 1
697		-1.9999 => -1
698		 0.0001 => 0
699		-0.0001 => -0
700
701	precision: 1
702		    2.5 => 2.5
703		   -2.5 => -2.5
704		    3.5 => 3.5
705		   -3.5 => -3.5
706		      7 => 7
707		     -7 => -7
708		  15.51 => 15.5
709		 -15.51 => -15.5
710		      5 => 5
711		     -5 => -5
712		   0.61 => 0.6
713		   0.69 => 0.6
714		   0.65 => 0.6
715		  -0.65 => -0.6
716		 1.9999 => 1.9
717		-1.9999 => -1.9
718		 0.0001 => 0
719		-0.0001 => -0
720
721	precision: 2
722		    2.5 => 2.5
723		   -2.5 => -2.5
724		    3.5 => 3.5
725		   -3.5 => -3.5
726		      7 => 7
727		     -7 => -7
728		  15.51 => 15.51
729		 -15.51 => -15.51
730		      5 => 5
731		     -5 => -5
732		   0.61 => 0.61
733		   0.69 => 0.69
734		   0.65 => 0.65
735		  -0.65 => -0.65
736		 1.9999 => 1.99
737		-1.9999 => -1.99
738		 0.0001 => 0
739		-0.0001 => -0
740
741	precision: 10
742		    2.5 => 2.5
743		   -2.5 => -2.5
744		    3.5 => 3.5
745		   -3.5 => -3.5
746		      7 => 7
747		     -7 => -7
748		  15.51 => 15.51
749		 -15.51 => -15.51
750		      5 => 5
751		     -5 => -5
752		   0.61 => 0.61
753		   0.69 => 0.69
754		   0.65 => 0.65
755		  -0.65 => -0.65
756		 1.9999 => 1.9999
757		-1.9999 => -1.9999
758		 0.0001 => 0.0001
759		-0.0001 => -0.0001
760
761mode: PHP_ROUND_AWAY_FROM_ZERO
762	precision: -1
763		    2.5 => 10
764		   -2.5 => -10
765		    3.5 => 10
766		   -3.5 => -10
767		      7 => 10
768		     -7 => -10
769		  15.51 => 20
770		 -15.51 => -20
771		      5 => 10
772		     -5 => -10
773		   0.61 => 10
774		   0.69 => 10
775		   0.65 => 10
776		  -0.65 => -10
777		 1.9999 => 10
778		-1.9999 => -10
779		 0.0001 => 10
780		-0.0001 => -10
781
782	precision: 0
783		    2.5 => 3
784		   -2.5 => -3
785		    3.5 => 4
786		   -3.5 => -4
787		      7 => 7
788		     -7 => -7
789		  15.51 => 16
790		 -15.51 => -16
791		      5 => 5
792		     -5 => -5
793		   0.61 => 1
794		   0.69 => 1
795		   0.65 => 1
796		  -0.65 => -1
797		 1.9999 => 2
798		-1.9999 => -2
799		 0.0001 => 1
800		-0.0001 => -1
801
802	precision: 1
803		    2.5 => 2.5
804		   -2.5 => -2.5
805		    3.5 => 3.5
806		   -3.5 => -3.5
807		      7 => 7
808		     -7 => -7
809		  15.51 => 15.6
810		 -15.51 => -15.6
811		      5 => 5
812		     -5 => -5
813		   0.61 => 0.7
814		   0.69 => 0.7
815		   0.65 => 0.7
816		  -0.65 => -0.7
817		 1.9999 => 2
818		-1.9999 => -2
819		 0.0001 => 0.1
820		-0.0001 => -0.1
821
822	precision: 2
823		    2.5 => 2.5
824		   -2.5 => -2.5
825		    3.5 => 3.5
826		   -3.5 => -3.5
827		      7 => 7
828		     -7 => -7
829		  15.51 => 15.51
830		 -15.51 => -15.51
831		      5 => 5
832		     -5 => -5
833		   0.61 => 0.61
834		   0.69 => 0.69
835		   0.65 => 0.65
836		  -0.65 => -0.65
837		 1.9999 => 2
838		-1.9999 => -2
839		 0.0001 => 0.01
840		-0.0001 => -0.01
841
842	precision: 10
843		    2.5 => 2.5
844		   -2.5 => -2.5
845		    3.5 => 3.5
846		   -3.5 => -3.5
847		      7 => 7
848		     -7 => -7
849		  15.51 => 15.51
850		 -15.51 => -15.51
851		      5 => 5
852		     -5 => -5
853		   0.61 => 0.61
854		   0.69 => 0.69
855		   0.65 => 0.65
856		  -0.65 => -0.65
857		 1.9999 => 1.9999
858		-1.9999 => -1.9999
859		 0.0001 => 0.0001
860		-0.0001 => -0.0001
861