这段代码:
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,215f64
:±9,007,199,254,740,991
关于rust - 在 Rust 中将 usize 转换为 f64 时,注意精度损失的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36235377/