diff --git a/ext/bcmath/libbcmath/src/bcmath.h b/ext/bcmath/libbcmath/src/bcmath.h index 9f2a7364ec6..e6273c18a11 100644 --- a/ext/bcmath/libbcmath/src/bcmath.h +++ b/ext/bcmath/libbcmath/src/bcmath.h @@ -110,6 +110,8 @@ int bc_compare(bc_num n1, bc_num n2); char bc_is_zero(bc_num num); +char bc_is_zero_for_scale(bc_num num, int scale); + char bc_is_near_zero(bc_num num, int scale); char bc_is_neg(bc_num num); diff --git a/ext/bcmath/libbcmath/src/num2str.c b/ext/bcmath/libbcmath/src/num2str.c index 3e231581252..39f7adb1f0c 100644 --- a/ext/bcmath/libbcmath/src/num2str.c +++ b/ext/bcmath/libbcmath/src/num2str.c @@ -50,7 +50,7 @@ zend_string int index, signch; /* Allocate the string memory. */ - signch = num->n_sign != PLUS; /* Number of sign chars. */ + signch = num->n_sign != PLUS && !bc_is_zero_for_scale(num, MIN(num->n_scale, scale)); /* Number of sign chars. */ if (scale > 0) str = zend_string_alloc(num->n_len + scale + signch + 1, 0); else diff --git a/ext/bcmath/libbcmath/src/zero.c b/ext/bcmath/libbcmath/src/zero.c index 28038201242..ba188d04369 100644 --- a/ext/bcmath/libbcmath/src/zero.c +++ b/ext/bcmath/libbcmath/src/zero.c @@ -40,7 +40,7 @@ /* In some places we need to check if the number NUM is zero. */ char -bc_is_zero (bc_num num) +bc_is_zero_for_scale (bc_num num, int scale) { int count; char *nptr; @@ -49,7 +49,7 @@ bc_is_zero (bc_num num) if (num == BCG(_zero_)) return TRUE; /* Initialize */ - count = num->n_len + num->n_scale; + count = num->n_len + scale; nptr = num->n_value; /* The check */ @@ -60,3 +60,9 @@ bc_is_zero (bc_num num) else return TRUE; } + +char +bc_is_zero (bc_num num) +{ + return bc_is_zero_for_scale(num, num->n_scale); +} diff --git a/ext/bcmath/tests/bug78238.phpt b/ext/bcmath/tests/bug78238.phpt new file mode 100644 index 00000000000..b4246bf7c48 --- /dev/null +++ b/ext/bcmath/tests/bug78238.phpt @@ -0,0 +1,16 @@ +--TEST-- +Bug #78238 (BCMath returns "-0") +--EXTENSIONS-- +bcmath +--FILE-- + +--EXPECT-- +string(1) "0" +string(3) "0.0" +string(3) "0.0"