Clippy 抱怨严格的 f32 比较

Clippy complaining on strict f32 comparison

我有一个看起来像这样的测试断言

assert_eq!(-0.000031989493, res);

适用于测试。但是当我 运行 Clippy 在我的测试中它抱怨时。

error: strict comparison of `f32` or `f64`
   --> src/main.rs:351:9
    |
351 |         assert_eq!(-0.000031989493, res);
    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = note: `f32::EPSILON` and `f64::EPSILON` are available for the `error_margin`
    = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#float_cmp
    = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)

我查看了提供的 link https://rust-lang.github.io/rust-clippy/master/index.html#float_cmp 并改写为这样。

assert_eq!(
    true,
    (res - -0.000031989493).abs() < f32::EPSILON
);

但这会降低测试的可读性,如果测试失败,我将无法在输出中看到我正在测试的结果。

我应该如何编写我的 f32 比较断言,以便 Clippy 满意并且测试在失败时仍会在终端中输出值?

或者我不应该 运行 Clippy 在我的测试中?

谢谢!

好的,我已经复制并稍微修改了 assert_eq 宏

macro_rules! assert_almost_eq {
    ($left:expr, $right:expr, $prec:expr) => {{
        match (&$left, &$right) {
            (left_val, right_val) => {
                let diff = (left_val - right_val).abs();

                if diff > $prec {
                    panic!(
                        "assertion failed: `(left == right)`\n      left: `{:?}`,\n     right: `{:?}`",
                        &*left_val, &*right_val
                    )
                }
            }
        }
    }};
}

我不是很明白一切,比如匹配的原因,但它似乎解决了我的问题。