rust - 在 Rust 中将 usize 转换为 f64 时,注意精度损失的最佳方法是什么?

标签 rust

这段代码:

use std::usize;

fn main() {
    fn main() {
    let a = usize::MAX;
    println!("{:?}", a );
    println!("{:?}", a as f64 );
}

返回

18446744073709551615
18446744073709552000

了解这种精度损失的最佳方法是什么?

最佳答案

conv crate 就是为处理这个问题而设计的。 ValueFrom/ValueInto 特征执行保值转换,如果输入值无法在输出类型中准确表示,则将返回错误。例如:

/*!
Add this to your `Cargo.toml`:

```cargo
[dependencies]
conv = "0.3.2"
```
*/
extern crate conv;

use conv::prelude::*;

fn main() {
    let a = std::u32::MAX;
    println!("u32::MAX -> f32: {:?}", a.value_as::<f32>());
    println!("u32::MAX -> f64: {:?}", a.value_as::<f64>());
}

输出:

u32::MAX -> f32: Err(PosOverflow(..))
u32::MAX -> f64: Ok(4294967295)

或者,您可以手动复制 conv 的检查:检查输入整数是否超出浮点类型可以准确表示的整数范围。具体来说:

  • f32:±16,777,215
  • f64:±9,007,199,254,740,991

关于rust - 在 Rust 中将 usize 转换为 f64 时,注意精度损失的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36235377/

相关文章:

rust - 有没有办法在 Option 中拆分变量而不必使用 if 语句?

generics - 如何编写采用本身是通用类型的通用函数?

rust - 哪里有课!红 bean 杉的宏

asynchronous - 为什么async-std的task::spawn阻止了后续代码行的执行?

rust - 如何消除Rust的特征?

rust - 如何在 Rust 中最好地 *fake* 关键字样式函数参数?

rust - 如何在 Rust 中处理/规避 "Cannot assign to ... which is behind a & reference"?

rust - 我可以在 Rust 中包含模块 "sideways"吗?

rust - 为什么包含 Box 的枚举不可复制?

泛型错误 : expected type parameter, 找到结构