簡體   English   中英

將 Rust 中的兩個浮點數與任意精度水平進行比較

[英]Comparison of two floats in Rust to arbitrary level of precision

如何在任意精度級別進行比較,以便我可以看到兩個數字相同? 在 Python 中,我會使用像round()這樣的函數,所以我在 Rust 中尋找等價的東西。

例如我有:

let x = 1.45555454;
let y = 1.45556766;

在我的情況下,它們相似到小數點后 2 位。 因此,為了比較, xy將變為 1.46。 我可以格式化這些,但這肯定很慢,檢查等效性的最佳 Rust 方法是什么,所以:

if x == y { // called when we match to 2 decimal places}

進一步闡明問題並提供一些背景信息。 這真的是為了美元和美分的准確性。 所以通常在python會使用round()函數來解決所有問題。 是的,我知道浮點表示的局限性。 有兩個計算金額的函數,我以美元計算,需要將美分部分處理到最接近的一分錢。

詢問社區的原因是我懷疑如果我自己動手,它可能會影響性能,這就是我使用 Rust 的原因,所以我在這里。 另外,我在 Rust 文檔中看到了一種叫做round() 的東西,但與 python 版本不同,它似乎采用零參數。

來自 Python 文檔:

注意round()對浮點數的行為可能令人驚訝:例如, round(2.675, 2)給出2.67而不是預期的2.68 這不是錯誤:這是大多數十進制分數不能完全表示為浮點數的結果。

有關更多信息,請查看每個程序員應該了解的關於浮點運算的知識


如果您不了解計算機如何處理浮點數,請不要使用此代碼 如果您知道自己遇到了什么麻煩:

fn approx_equal(a: f64, b: f64, decimal_places: u8) -> bool {
    let factor = 10.0f64.powi(decimal_places as i32);
    let a = (a * factor).trunc();
    let b = (b * factor).trunc();
    a == b
}

fn main() {
    assert!( approx_equal(1.234, 1.235, 1));
    assert!( approx_equal(1.234, 1.235, 2));
    assert!(!approx_equal(1.234, 1.235, 3));
}

已知(或可能)被此代碼破壞的事物的非詳盡列表:

  • 足夠大的浮點數和/或小數點數
  • 非規范化數字
  • NaN
  • 無窮大
  • 接近於零的值 ( approx_equal(0.09, -0.09, 1) )

一個潛在的替代方法是使用定點或任意精度類型,這兩種類型都會變慢,但對大多數人來說在邏輯上更一致。

這個對我來說似乎很有效。

fn approx_equal (a:f64,b:f64,dp:u8) -> bool {
    let p:f64 = 10f64.powf(-(dp as f64));

    if (a-b).abs() < p {
        return true;
    } else {
        return false;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM