面试题答案
一键面试常见场景
- 小数精度问题:由于浮点数在计算机中采用二进制表示,许多十进制小数无法精确转换为二进制小数,例如
0.1
在二进制中是无限循环小数。在进行连续的浮点数加法运算时,误差可能累积。例如:
let mut sum = 0.0;
for _ in 0..10 {
sum += 0.1;
}
println!("sum: {}", sum);
// 输出可能不是1.0,而是接近1.0的一个值,如0.9999999999999999
- 比较运算:因为浮点数存在精度误差,直接使用
==
进行比较可能会得到意外结果。例如:
let a = 0.1 + 0.2;
let b = 0.3;
println!("a == b: {}", a == b);
// 由于精度问题,可能输出false
控制误差的方法
- 使用
approx
库:approx
库提供了更适合浮点数比较的方法。首先在Cargo.toml
中添加依赖:
[dependencies]
approx = "0.4"
然后在代码中使用:
use approx::assert_relative_eq;
let a = 0.1 + 0.2;
let b = 0.3;
assert_relative_eq!(a, b);
- 设置误差范围:在手动比较时,设定一个可接受的误差范围。例如:
let a = 0.1 + 0.2;
let b = 0.3;
let epsilon = 1e-6;
if (a - b).abs() < epsilon {
println!("a and b are approximately equal");
}
- 使用
round
方法:对于一些运算结果,可以通过round
方法进行舍入来控制误差。例如:
let num = 0.1 + 0.2;
let rounded = num.round();
println!("rounded: {}", rounded);