> For the complete documentation index, see [llms.txt](https://cracker8090.gitbook.io/rustnotes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://cracker8090.gitbook.io/rustnotes/rust-ji-chu/bian-liang-shu-ju-lei-xing/fu-dian-shu.md).

# 浮点数

Rust 的 `HashMap` 数据结构，是一个 KV 类型的 Hash Map 实现，它对于 `K` 没有特定类型的限制，但是要求能用作 `K` 的类型必须实现了 `std::cmp::Eq` 特征，因此这意味着你无法使用浮点数作为 `HashMap` 的 `Key`，来存储键值对，但是作为对比，Rust 的整数类型、字符串类型、布尔类型都实现了该特征，因此可以作为 `HashMap` 的 `Key`。

浮点数需要遵守以下准则：

* 避免在浮点数上测试相等性
* 当结果在数学上可能存在未定义时，需要格外的小心

```rust
fn main() {
  // 断言0.1 + 0.2与0.3相等
  assert!(0.1 + 0.2 == 0.3);
}
// 错误 panic
```

`(0.1_f64 + 0.2 - 0.3).abs() < 0.00001` ，具体小于多少，取决于你对精度的需求

```rust
fn main() {
    let abc: (f32, f32, f32) = (0.1, 0.2, 0.3);
    let xyz: (f64, f64, f64) = (0.1, 0.2, 0.3);

    println!("abc (f32)");
    println!("     0.1 + 0.2: {:?}", (abc.0 + abc.1).to_bits());
    println!("           0.3: {:?}", (abc.2).to_bits());
    println!();

    println!("xyz (f64)");
    println!("     0.1 + 0.2: {:?}", (xyz.0 + xyz.1).to_bits());
    println!("           0.3: {:?}", (xyz.2).to_bits());
    println!();

    assert!(abc.0 + abc.1 == abc.2);
    assert!(xyz.0 + xyz.1 == xyz.2);
}
// 断言失败
abc (f32)
     0.1 + 0.2: 1050253722
           0.3: 1050253722

xyz (f64)
     0.1 + 0.2: 4599075939470750516
           0.3: 4599075939470750515
```
