@@ -294,8 +294,14 @@ fn construct_extended_big_decimal<'a>(
294294 scale : u64 ,
295295 exponent : BigInt ,
296296) -> Result < ExtendedBigDecimal , ExtendedParserError < ' a , ExtendedBigDecimal > > {
297- if digits == BigUint :: zero ( ) && negative {
298- return Ok ( ExtendedBigDecimal :: MinusZero ) ;
297+ if digits == BigUint :: zero ( ) {
298+ // Return return 0 if the digits are zero. In particular, we do not ever
299+ // return Overflow/Underflow errors in that case.
300+ return Ok ( if negative {
301+ ExtendedBigDecimal :: MinusZero
302+ } else {
303+ ExtendedBigDecimal :: zero ( )
304+ } ) ;
299305 }
300306
301307 let sign = if negative { Sign :: Minus } else { Sign :: Plus } ;
@@ -712,6 +718,24 @@ mod tests {
712718 ExtendedBigDecimal :: MinusZero
713719 ) )
714720 ) ) ;
721+
722+ // But no Overflow/Underflow if the digits are 0.
723+ assert_eq ! (
724+ ExtendedBigDecimal :: extended_parse( & format!( "0e{}" , i64 :: MAX as u64 + 2 ) ) ,
725+ Ok ( ExtendedBigDecimal :: zero( ) ) ,
726+ ) ;
727+ assert_eq ! (
728+ ExtendedBigDecimal :: extended_parse( & format!( "-0.0e{}" , i64 :: MAX as u64 + 3 ) ) ,
729+ Ok ( ExtendedBigDecimal :: MinusZero )
730+ ) ;
731+ assert_eq ! (
732+ ExtendedBigDecimal :: extended_parse( & format!( "0.0000e{}" , i64 :: MIN ) ) ,
733+ Ok ( ExtendedBigDecimal :: zero( ) ) ,
734+ ) ;
735+ assert_eq ! (
736+ ExtendedBigDecimal :: extended_parse( & format!( "-0e{}" , i64 :: MIN + 2 ) ) ,
737+ Ok ( ExtendedBigDecimal :: MinusZero )
738+ ) ;
715739 }
716740
717741 #[ test]
0 commit comments