@@ -592,6 +592,17 @@ static void php_decimal_set_nan(php_decimal_t *obj)
592592 php_decimal_mpd_set_nan (PHP_DECIMAL_MPD (obj ));
593593}
594594
595+ /**
596+ * Sets the value to "0" in case it is "-0"
597+ */
598+ static void php_decimal_prevent_negative_zero (mpd_t * mpd )
599+ {
600+ if (mpd_iszero (mpd ) && mpd_isnegative (mpd )) {
601+ uint32_t status = 0 ;
602+ mpd_qcopy_negate (mpd , mpd , & status );
603+ }
604+ }
605+
595606/**
596607 * Parses a string to a given precision. Trailing zeroes are not preserved.
597608 */
@@ -617,6 +628,8 @@ static php_success_t php_decimal_mpd_set_string(mpd_t *mpd, zend_string *str, ze
617628 php_decimal_loss_of_data_on_string_conversion ();
618629 }
619630
631+ php_decimal_prevent_negative_zero (mpd );
632+
620633 return SUCCESS ;
621634}
622635
@@ -1157,12 +1170,16 @@ static void php_decimal_ceil(php_decimal_t *res, mpd_t *op1)
11571170 */
11581171static void php_decimal_truncate (php_decimal_t * res , mpd_t * op1 )
11591172{
1173+ mpd_t * mpd = PHP_DECIMAL_MPD (res );
11601174 uint32_t status = 0 ;
1175+
11611176 if (mpd_isspecial (op1 )) {
1162- mpd_qcopy (PHP_DECIMAL_MPD ( res ) , op1 , & status );
1177+ mpd_qcopy (mpd , op1 , & status );
11631178 return ;
11641179 }
1165- mpd_qtrunc (PHP_DECIMAL_MPD (res ), op1 , php_decimal_context (), & status );
1180+
1181+ mpd_qtrunc (mpd , op1 , php_decimal_context (), & status );
1182+ php_decimal_prevent_negative_zero (mpd );
11661183}
11671184
11681185/**
@@ -1197,6 +1214,12 @@ static void php_decimal_abs(php_decimal_t *res, mpd_t *op1)
11971214static void php_decimal_negate (php_decimal_t * res , mpd_t * op1 )
11981215{
11991216 uint32_t status = 0 ;
1217+
1218+ if (mpd_iszero (op1 )) {
1219+ mpd_qcopy (PHP_DECIMAL_MPD (res ), op1 , & status );
1220+ return ;
1221+ }
1222+
12001223 mpd_qcopy_negate (PHP_DECIMAL_MPD (res ), op1 , & status );
12011224}
12021225
@@ -1433,6 +1456,8 @@ static void php_decimal_do_binary_op(php_decimal_binary_op_t op, php_decimal_t *
14331456 php_decimal_set_precision (res , prec );
14341457 op (res , mpd1 , mpd2 );
14351458 mpd_del (& tmp );
1459+
1460+ php_decimal_prevent_negative_zero (PHP_DECIMAL_MPD (res ));
14361461}
14371462
14381463
@@ -2201,7 +2226,10 @@ PHP_DECIMAL_METHOD(round)
22012226 #endif
22022227 ZEND_PARSE_PARAMETERS_END ();
22032228
2204- php_decimal_round_mpd (PHP_DECIMAL_MPD (res ), PHP_DECIMAL_MPD (obj ), places , rounding );
2229+ mpd_t * mpd = PHP_DECIMAL_MPD (res );
2230+ php_decimal_round_mpd (mpd , PHP_DECIMAL_MPD (obj ), places , rounding );
2231+ php_decimal_prevent_negative_zero (mpd );
2232+
22052233 RETURN_DECIMAL (res );
22062234}
22072235
@@ -2373,7 +2401,10 @@ PHP_DECIMAL_ARGINFO_END()
23732401PHP_DECIMAL_METHOD (isPositive )
23742402{
23752403 PHP_DECIMAL_PARAMS_PARSE_NONE ();
2376- RETURN_BOOL (mpd_ispositive (THIS_MPD ()));
2404+
2405+ mpd_t * mpd = THIS_MPD ();
2406+
2407+ RETURN_BOOL (!mpd_iszero (mpd ) && mpd_ispositive (mpd ));
23772408}
23782409
23792410/**
@@ -2384,7 +2415,10 @@ PHP_DECIMAL_ARGINFO_END()
23842415PHP_DECIMAL_METHOD (isNegative )
23852416{
23862417 PHP_DECIMAL_PARAMS_PARSE_NONE ();
2387- RETURN_BOOL (mpd_isnegative (THIS_MPD ()));
2418+
2419+ mpd_t * mpd = THIS_MPD ();
2420+
2421+ RETURN_BOOL (!mpd_iszero (mpd ) && mpd_isnegative (mpd ));
23882422}
23892423
23902424/**
0 commit comments