Skip to content

Commit 5dd5131

Browse files
committed
The return value of round returns the scale before removing unnecessary zeros, and uses that.
1 parent b05dd80 commit 5dd5131

File tree

3 files changed

+14
-12
lines changed

3 files changed

+14
-12
lines changed

ext/bcmath/bcmath.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -807,8 +807,8 @@ PHP_FUNCTION(bcround)
807807
goto cleanup;
808808
}
809809

810-
bc_round(num, precision, mode, &result);
811-
RETVAL_NEW_STR(bc_num2str_ex(result, result->n_scale));
810+
size_t scale = bc_round(num, precision, mode, &result);
811+
RETVAL_NEW_STR(bc_num2str_ex(result, scale));
812812

813813
cleanup: {
814814
bc_free_num(&num);
@@ -1799,9 +1799,9 @@ PHP_METHOD(BcMath_Number, round)
17991799
bcmath_number_obj_t *intern = get_bcmath_number_from_zval(ZEND_THIS);
18001800

18011801
bc_num ret = NULL;
1802-
bc_round(intern->num, precision, rounding_mode, &ret);
1802+
size_t scale = bc_round(intern->num, precision, rounding_mode, &ret);
18031803

1804-
bcmath_number_obj_t *new_intern = bcmath_number_new_obj(ret, ret->n_scale);
1804+
bcmath_number_obj_t *new_intern = bcmath_number_new_obj(ret, scale);
18051805
RETURN_OBJ(&new_intern->std);
18061806
}
18071807

ext/bcmath/libbcmath/src/bcmath.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ bool bc_divmod(bc_num num1, bc_num num2, bc_num *quo, bc_num *rem, size_t scale)
157157

158158
bc_num bc_floor_or_ceil(bc_num num, bool is_floor);
159159

160-
void bc_round(bc_num num, zend_long places, zend_long mode, bc_num *result);
160+
size_t bc_round(bc_num num, zend_long places, zend_long mode, bc_num *result);
161161

162162
typedef enum {
163163
OK,

ext/bcmath/libbcmath/src/round.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
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+
size_t bc_round(bc_num num, zend_long precision, zend_long mode, bc_num *result)
2222
{
2323
/* clear result */
2424
bc_free_num(result);
@@ -43,19 +43,19 @@ void bc_round(bc_num num, zend_long precision, zend_long mode, bc_num *result)
4343
case PHP_ROUND_HALF_ODD:
4444
case PHP_ROUND_TOWARD_ZERO:
4545
*result = bc_copy_num(BCG(_zero_));
46-
return;
46+
return 0;
4747

4848
case PHP_ROUND_CEILING:
4949
if (num->n_sign == MINUS) {
5050
*result = bc_copy_num(BCG(_zero_));
51-
return;
51+
return 0;
5252
}
5353
break;
5454

5555
case PHP_ROUND_FLOOR:
5656
if (num->n_sign == PLUS) {
5757
*result = bc_copy_num(BCG(_zero_));
58-
return;
58+
return 0;
5959
}
6060
break;
6161

@@ -67,7 +67,7 @@ void bc_round(bc_num num, zend_long precision, zend_long mode, bc_num *result)
6767

6868
if (bc_is_zero(num)) {
6969
*result = bc_copy_num(BCG(_zero_));
70-
return;
70+
return 0;
7171
}
7272

7373
/* If precision is -3, it becomes 1000. */
@@ -78,7 +78,7 @@ void bc_round(bc_num num, zend_long precision, zend_long mode, bc_num *result)
7878
}
7979
(*result)->n_value[0] = 1;
8080
(*result)->n_sign = num->n_sign;
81-
return;
81+
return 0;
8282
}
8383

8484
/* Just like bcadd('1', '1', 4) becomes '2.0000', it pads with zeros at the end if necessary. */
@@ -90,7 +90,7 @@ void bc_round(bc_num num, zend_long precision, zend_long mode, bc_num *result)
9090
(*result)->n_sign = num->n_sign;
9191
memcpy((*result)->n_value, num->n_value, num->n_len + num->n_scale);
9292
}
93-
return;
93+
return precision;
9494
}
9595

9696
/*
@@ -222,8 +222,10 @@ void bc_round(bc_num num, zend_long precision, zend_long mode, bc_num *result)
222222
}
223223

224224
check_zero:
225+
size_t scale = (*result)->n_scale;
225226
if (bc_is_zero(*result)) {
226227
(*result)->n_sign = PLUS;
227228
(*result)->n_scale = 0;
228229
}
230+
return scale;
229231
}

0 commit comments

Comments
 (0)