@@ -592,6 +592,17 @@ static void php_decimal_set_nan(php_decimal_t *obj)
592
592
php_decimal_mpd_set_nan (PHP_DECIMAL_MPD (obj ));
593
593
}
594
594
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
+
595
606
/**
596
607
* Parses a string to a given precision. Trailing zeroes are not preserved.
597
608
*/
@@ -617,6 +628,8 @@ static php_success_t php_decimal_mpd_set_string(mpd_t *mpd, zend_string *str, ze
617
628
php_decimal_loss_of_data_on_string_conversion ();
618
629
}
619
630
631
+ php_decimal_prevent_negative_zero (mpd );
632
+
620
633
return SUCCESS ;
621
634
}
622
635
@@ -1157,12 +1170,16 @@ static void php_decimal_ceil(php_decimal_t *res, mpd_t *op1)
1157
1170
*/
1158
1171
static void php_decimal_truncate (php_decimal_t * res , mpd_t * op1 )
1159
1172
{
1173
+ mpd_t * mpd = PHP_DECIMAL_MPD (res );
1160
1174
uint32_t status = 0 ;
1175
+
1161
1176
if (mpd_isspecial (op1 )) {
1162
- mpd_qcopy (PHP_DECIMAL_MPD ( res ) , op1 , & status );
1177
+ mpd_qcopy (mpd , op1 , & status );
1163
1178
return ;
1164
1179
}
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 );
1166
1183
}
1167
1184
1168
1185
/**
@@ -1197,6 +1214,12 @@ static void php_decimal_abs(php_decimal_t *res, mpd_t *op1)
1197
1214
static void php_decimal_negate (php_decimal_t * res , mpd_t * op1 )
1198
1215
{
1199
1216
uint32_t status = 0 ;
1217
+
1218
+ if (mpd_iszero (op1 )) {
1219
+ mpd_qcopy (PHP_DECIMAL_MPD (res ), op1 , & status );
1220
+ return ;
1221
+ }
1222
+
1200
1223
mpd_qcopy_negate (PHP_DECIMAL_MPD (res ), op1 , & status );
1201
1224
}
1202
1225
@@ -1433,6 +1456,8 @@ static void php_decimal_do_binary_op(php_decimal_binary_op_t op, php_decimal_t *
1433
1456
php_decimal_set_precision (res , prec );
1434
1457
op (res , mpd1 , mpd2 );
1435
1458
mpd_del (& tmp );
1459
+
1460
+ php_decimal_prevent_negative_zero (PHP_DECIMAL_MPD (res ));
1436
1461
}
1437
1462
1438
1463
@@ -2201,7 +2226,10 @@ PHP_DECIMAL_METHOD(round)
2201
2226
#endif
2202
2227
ZEND_PARSE_PARAMETERS_END ();
2203
2228
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
+
2205
2233
RETURN_DECIMAL (res );
2206
2234
}
2207
2235
@@ -2373,7 +2401,10 @@ PHP_DECIMAL_ARGINFO_END()
2373
2401
PHP_DECIMAL_METHOD (isPositive )
2374
2402
{
2375
2403
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 ));
2377
2408
}
2378
2409
2379
2410
/**
@@ -2384,7 +2415,10 @@ PHP_DECIMAL_ARGINFO_END()
2384
2415
PHP_DECIMAL_METHOD (isNegative )
2385
2416
{
2386
2417
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 ));
2388
2422
}
2389
2423
2390
2424
/**
0 commit comments