diff --git a/benches/benchmark.rs b/benches/benchmark.rs index e9a715e..f8ff293 100644 --- a/benches/benchmark.rs +++ b/benches/benchmark.rs @@ -155,6 +155,14 @@ fn decimal_hash(bench: &mut Bencher) { }) } +fn decimal_cmp(bench: &mut Bencher) { + let x = parse("12345678901.23456789"); + let y = parse("12345.67890123456789"); + bench.iter(|| { + let _n = black_box(x > y); + }) +} + benchmark_group!( decimal_benches, decimal_parse, @@ -171,6 +179,7 @@ benchmark_group!( decimal_decode, decimal_normalize, decimal_hash, + decimal_cmp, ); benchmark_main!(decimal_benches); diff --git a/src/decimal.rs b/src/decimal.rs index bd4f9fe..36a5802 100644 --- a/src/decimal.rs +++ b/src/decimal.rs @@ -785,6 +785,16 @@ impl Ord for Decimal { (self, other) }; + if left.is_zero() { + return if right.is_zero() { + Ordering::Equal + } else { + Ordering::Less + }; + } else if right.is_zero() { + return Ordering::Greater; + } + if left.scale == right.scale { // fast path for same scale return left.int_val.cmp(&right.int_val); @@ -967,6 +977,14 @@ mod tests { assert_cmp!( "-9.9999999999999999999999999999999999999", <, "1" ); + assert_cmp!("4703178999618078116505370421100e39", >, "0"); + assert_cmp!("4703178999618078116505370421100e-39", >, "0"); + assert_cmp!("-4703178999618078116505370421100e39", <, "0"); + assert_cmp!("-4703178999618078116505370421100e-39", <, "0"); + assert_cmp!("0", <, "4703178999618078116505370421100e39"); + assert_cmp!("0", <, "4703178999618078116505370421100e-39"); + assert_cmp!("0", >, "-4703178999618078116505370421100e39"); + assert_cmp!("0", >, "-4703178999618078116505370421100e-39"); } #[test]