1818#include "private.h"
1919#include <stddef.h>
2020
21- void bc_round (bc_num num , zend_long precision , zend_long mode , bc_num * result )
21+ /* Returns the scale of the value after rounding. */
22+ size_t bc_round (bc_num num , zend_long precision , zend_long mode , bc_num * result )
2223{
2324 /* clear result */
2425 bc_free_num (result );
@@ -43,19 +44,19 @@ void bc_round(bc_num num, zend_long precision, zend_long mode, bc_num *result)
4344 case PHP_ROUND_HALF_ODD :
4445 case PHP_ROUND_TOWARD_ZERO :
4546 * result = bc_copy_num (BCG (_zero_ ));
46- return ;
47+ return 0 ;
4748
4849 case PHP_ROUND_CEILING :
4950 if (num -> n_sign == MINUS ) {
5051 * result = bc_copy_num (BCG (_zero_ ));
51- return ;
52+ return 0 ;
5253 }
5354 break ;
5455
5556 case PHP_ROUND_FLOOR :
5657 if (num -> n_sign == PLUS ) {
5758 * result = bc_copy_num (BCG (_zero_ ));
58- return ;
59+ return 0 ;
5960 }
6061 break ;
6162
@@ -67,7 +68,7 @@ void bc_round(bc_num num, zend_long precision, zend_long mode, bc_num *result)
6768
6869 if (bc_is_zero (num )) {
6970 * result = bc_copy_num (BCG (_zero_ ));
70- return ;
71+ return 0 ;
7172 }
7273
7374 /* If precision is -3, it becomes 1000. */
@@ -78,7 +79,7 @@ void bc_round(bc_num num, zend_long precision, zend_long mode, bc_num *result)
7879 }
7980 (* result )-> n_value [0 ] = 1 ;
8081 (* result )-> n_sign = num -> n_sign ;
81- return ;
82+ return 0 ;
8283 }
8384
8485 /* Just like bcadd('1', '1', 4) becomes '2.0000', it pads with zeros at the end if necessary. */
@@ -90,7 +91,7 @@ void bc_round(bc_num num, zend_long precision, zend_long mode, bc_num *result)
9091 (* result )-> n_sign = num -> n_sign ;
9192 memcpy ((* result )-> n_value , num -> n_value , num -> n_len + num -> n_scale );
9293 }
93- return ;
94+ return precision ;
9495 }
9596
9697 /*
@@ -222,7 +223,12 @@ void bc_round(bc_num num, zend_long precision, zend_long mode, bc_num *result)
222223 }
223224
224225check_zero :
225- if (bc_is_zero (* result )) {
226- (* result )-> n_sign = PLUS ;
226+ {
227+ size_t scale = (* result )-> n_scale ;
228+ if (bc_is_zero (* result )) {
229+ (* result )-> n_sign = PLUS ;
230+ (* result )-> n_scale = 0 ;
231+ }
232+ return scale ;
227233 }
228234}
0 commit comments