@@ -1008,6 +1008,7 @@ static inline void bcmath_number_add_internal(
1008
1008
* scale = MAX (n1_full_scale , n2_full_scale );
1009
1009
}
1010
1010
* ret = bc_add (n1 , n2 , * scale );
1011
+ bc_rm_trailing_zeros (* ret );
1011
1012
}
1012
1013
1013
1014
static inline void bcmath_number_sub_internal (
@@ -1018,6 +1019,7 @@ static inline void bcmath_number_sub_internal(
1018
1019
* scale = MAX (n1_full_scale , n2_full_scale );
1019
1020
}
1020
1021
* ret = bc_sub (n1 , n2 , * scale );
1022
+ bc_rm_trailing_zeros (* ret );
1021
1023
}
1022
1024
1023
1025
static inline void bcmath_number_mul_internal (
@@ -1028,6 +1030,7 @@ static inline void bcmath_number_mul_internal(
1028
1030
* scale = n1_full_scale + n2_full_scale ;
1029
1031
}
1030
1032
* ret = bc_multiply (n1 , n2 , * scale );
1033
+ bc_rm_trailing_zeros (* ret );
1031
1034
}
1032
1035
1033
1036
static inline zend_result bcmath_number_div_internal (
@@ -1041,6 +1044,12 @@ static inline zend_result bcmath_number_div_internal(
1041
1044
zend_throw_exception_ex (zend_ce_division_by_zero_error , 0 , "Division by zero" );
1042
1045
return FAILURE ;
1043
1046
}
1047
+ size_t ret_scale = (* ret )-> n_scale ;
1048
+ bc_rm_trailing_zeros (* ret );
1049
+ if (auto_scale ) {
1050
+ size_t diff = ret_scale - (* ret )-> n_scale ;
1051
+ * scale -= diff > BC_MATH_NUMBER_MAX_EX_SCALE ? BC_MATH_NUMBER_MAX_EX_SCALE : diff ;
1052
+ }
1044
1053
return SUCCESS ;
1045
1054
}
1046
1055
@@ -1055,6 +1064,7 @@ static inline zend_result bcmath_number_mod_internal(
1055
1064
zend_throw_exception_ex (zend_ce_division_by_zero_error , 0 , "Modulo by zero" );
1056
1065
return FAILURE ;
1057
1066
}
1067
+ bc_rm_trailing_zeros (* ret );
1058
1068
return SUCCESS ;
1059
1069
}
1060
1070
@@ -1073,11 +1083,13 @@ static inline zend_result bcmath_number_pow_internal(
1073
1083
}
1074
1084
long exponent = bc_num2long (n2 );
1075
1085
1086
+ bool scale_expand = false;
1076
1087
if (auto_scale ) {
1077
1088
if (exponent > 0 ) {
1078
1089
* scale = n1_full_scale * exponent ;
1079
1090
} else if (exponent < 0 ) {
1080
1091
* scale = n1_full_scale + BC_MATH_NUMBER_MAX_EX_SCALE ;
1092
+ scale_expand = true;
1081
1093
} else {
1082
1094
* scale = 0 ;
1083
1095
}
@@ -1092,6 +1104,12 @@ static inline zend_result bcmath_number_pow_internal(
1092
1104
return FAILURE ;
1093
1105
}
1094
1106
bc_raise (n1 , exponent , ret , * scale );
1107
+ size_t ret_scale = (* ret )-> n_scale ;
1108
+ bc_rm_trailing_zeros (* ret );
1109
+ if (scale_expand ) {
1110
+ size_t diff = ret_scale - (* ret )-> n_scale ;
1111
+ * scale -= diff > BC_MATH_NUMBER_MAX_EX_SCALE ? BC_MATH_NUMBER_MAX_EX_SCALE : diff ;
1112
+ }
1095
1113
return SUCCESS ;
1096
1114
}
1097
1115
@@ -1382,6 +1400,8 @@ PHP_METHOD(BcMath_Number, powmod)
1382
1400
bc_free_num (& modulus_num );
1383
1401
}
1384
1402
1403
+ bc_rm_trailing_zeros (ret );
1404
+
1385
1405
bcmath_number_obj_t * new_intern = bcmath_number_new_obj (ret , scale );
1386
1406
RETURN_OBJ (& new_intern -> std );
1387
1407
@@ -1413,7 +1433,7 @@ PHP_METHOD(BcMath_Number, sqrt)
1413
1433
1414
1434
size_t scale ;
1415
1435
if (scale_is_null ) {
1416
- scale = intern -> num -> n_scale ;
1436
+ scale = intern -> scale + BC_MATH_NUMBER_MAX_EX_SCALE ;
1417
1437
} else {
1418
1438
scale = arg_scale ;
1419
1439
}
@@ -1425,6 +1445,13 @@ PHP_METHOD(BcMath_Number, sqrt)
1425
1445
RETURN_THROWS ();
1426
1446
}
1427
1447
1448
+ size_t ret_scale = ret -> n_scale ;
1449
+ bc_rm_trailing_zeros (ret );
1450
+ if (scale_is_null ) {
1451
+ size_t diff = ret_scale - ret -> n_scale ;
1452
+ scale -= diff > BC_MATH_NUMBER_MAX_EX_SCALE ? BC_MATH_NUMBER_MAX_EX_SCALE : diff ;
1453
+ }
1454
+
1428
1455
bcmath_number_obj_t * new_intern = bcmath_number_new_obj (ret , scale );
1429
1456
RETURN_OBJ (& new_intern -> std );
1430
1457
}
@@ -1522,6 +1549,8 @@ PHP_METHOD(BcMath_Number, round)
1522
1549
bc_num ret = NULL ;
1523
1550
bc_round (intern -> num , precision , rounding_mode , & ret );
1524
1551
1552
+ bc_rm_trailing_zeros (ret );
1553
+
1525
1554
bcmath_number_obj_t * new_intern = bcmath_number_new_obj (ret , ret -> n_scale );
1526
1555
RETURN_OBJ (& new_intern -> std );
1527
1556
}
0 commit comments