From f147abda5f37479cdaa0662cda4f5f7fa4236355 Mon Sep 17 00:00:00 2001 From: Hexa Dust Date: Fri, 18 Jul 2025 21:19:30 +0100 Subject: [PATCH] fix for float parsing of exactly 10.0 --- src/calc.rs | 11 ++++++++++- src/lib.rs | 26 +++++++++++++++++++++++--- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/calc.rs b/src/calc.rs index 78b41c5..803f79f 100644 --- a/src/calc.rs +++ b/src/calc.rs @@ -19,7 +19,7 @@ impl Display for StackCalcError { match self { StackCalcError::StackOverflow => f.write_str("stack overflow"), StackCalcError::StackUnderflow => f.write_str("stack underflow"), - StackCalcError::DecimalError(de) => de.fmt(f), + StackCalcError::DecimalError(de) => Display::fmt(de, f), } } } @@ -185,4 +185,13 @@ mod tests { )); Ok(()) } + + #[test] + fn test_add_10() -> Result<(), StackCalcError> { + let mut calc = StackCalc::::default(); + calc.push(Decimal::new(false, [3, 0, 0, 0, 0], false, 0))?; + calc.push(Decimal::new(false, [7, 0, 0, 0, 0], false, 0))?; + assert_eq!(calc.add()?, Decimal::new(false, [1, 0, 0, 0, 0], false, 1)); + Ok(()) + } } diff --git a/src/lib.rs b/src/lib.rs index b5acf1a..bd5e69f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -81,7 +81,7 @@ impl Decimal { } let mut exponent: EXP = zero(); let minus_exponent = f < one() && f > zero(); - while f > F::from(10).unwrap() { + while f >= F::from(10).unwrap() { f = f / F::from(10).unwrap(); exponent = exponent .checked_add(&one()) @@ -234,6 +234,11 @@ mod tests { use super::*; use arrayvec::ArrayString; + fn round_f(f: f64, d: i32) -> f64 { + let m = 10.0.powi(d); + (f * m).round() / m + } + #[test] fn float_to_decimal_zero() { let dec = Decimal::<5>::try_from(0.0).unwrap(); @@ -243,6 +248,15 @@ mod tests { assert_eq!(dec.exponent, 0) } + #[test] + fn float_to_decimal_ten() { + let dec = Decimal::<5>::try_from(10.0).unwrap(); + assert!(!dec.minus); + assert_eq!(dec.significant, [1, 0, 0, 0, 0]); + assert!(!dec.minus_exponent); + assert_eq!(dec.exponent, 1) + } + #[test] fn float_to_decimal_pos_big() { let dec = Decimal::<7>::try_from(1337.42).unwrap(); @@ -344,7 +358,10 @@ mod tests { dec.significant = [1, 3, 3, 7, 4, 2, 1]; dec.minus_exponent = true; dec.exponent = 2; - assert_eq!(f64::try_from(dec).unwrap(), 0.01337421); + assert_eq!( + round_f(f64::try_from(dec).unwrap(), 8), + round_f(0.01337421, 8) + ); } #[test] @@ -363,7 +380,10 @@ mod tests { dec.significant = [1, 3, 3, 7, 4, 2, 1]; dec.minus_exponent = true; dec.exponent = 2; - assert_eq!(f64::try_from(dec).unwrap(), -0.01337421); + assert_eq!( + round_f(f64::try_from(dec).unwrap(), 8), + round_f(-0.01337421, 8) + ); } #[test]