面试题答案
一键面试出现精度问题的原因
计算机使用二进制来存储数据,而浮点数采用IEEE 754标准表示。像0.1、0.2这样的十进制小数,无法用有限位的二进制小数精确表示。例如,0.1的二进制表示是一个无限循环小数 0.0001100110011...
,在存储时会进行截断,导致精度丢失。所以在进行浮点数运算时,由于这些截断误差的积累,使得 0.1 + 0.2
的结果并不精确等于 0.3
。
处理浮点数精度问题的常用方法
使用 approx
库
approx
库提供了用于比较浮点数近似相等的功能。
use approx::assert_relative_eq;
fn main() {
let a = 0.1;
let b = 0.2;
let result = a + b;
assert_relative_eq!(result, 0.3);
}
在上述代码中,assert_relative_eq!
宏用于比较两个浮点数在相对误差范围内是否相等。
使用定点数
可以使用 rust_decimal
库来处理定点数,它能精确表示小数。
use rust_decimal::Decimal;
fn main() {
let a = Decimal::from_str("0.1").unwrap();
let b = Decimal::from_str("0.2").unwrap();
let result = a + b;
let expected = Decimal::from_str("0.3").unwrap();
assert_eq!(result, expected);
}
这里通过 rust_decimal
库将字符串形式的小数转换为 Decimal
类型进行精确运算,避免了浮点数的精度问题。