面试题答案
一键面试- 预期结果:
预期结果是
0.3
,因为按照常规的数学运算,0.1 + 0.2
的和是0.3
。 - 实际结果:
在Rust中执行
a + b
,实际结果接近但不等于0.3
,如0.30000000000000004
。示例代码如下:
fn main() {
let a = 0.1;
let b = 0.2;
let result = a + b;
println!("{}", result);
}
- 差异原因:
这是由于浮点数在计算机中采用二进制表示法。十进制小数(如
0.1
和0.2
)在二进制中可能无法精确表示,会产生无限循环的二进制小数。计算机在存储这些小数时会进行截断和近似,导致计算结果存在精度误差。 - 解决精度问题的方法:
- 使用
f64
类型(已有一定精度优化):Rust 中的f64
类型已经在一定程度上优化了精度,在许多场景下能满足需求。但对于高精度场景还不够。 - 使用
num-bigfloat
库:- 首先在
Cargo.toml
中添加依赖:
- 首先在
- 使用
[dependencies]
num-bigfloat = "0.4"
- 然后在代码中使用:
use num_bigfloat::{BigFloat, NumAssignOps};
fn main() {
let mut a = BigFloat::from_f64(0.1).unwrap();
let b = BigFloat::from_f64(0.2).unwrap();
a += &b;
println!("{}", a);
}
这样通过 num-bigfloat
库可以实现高精度的浮点数运算,解决精度问题。