fix for float parsing of exactly 10.0
This commit is contained in:
11
src/calc.rs
11
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::<f64, 3, 5>::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(())
|
||||
}
|
||||
}
|
||||
|
||||
26
src/lib.rs
26
src/lib.rs
@@ -81,7 +81,7 @@ impl<const SIZE: usize, EXP: PrimInt + Unsigned> Decimal<SIZE, EXP> {
|
||||
}
|
||||
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]
|
||||
|
||||
Reference in New Issue
Block a user