MST

星途 面试题库

面试题:Rust中浮点数精度问题及常见处理方式

在Rust中,浮点数运算可能会遇到精度问题。例如,0.1 + 0.2在浮点数运算中并不精确等于0.3。请阐述为什么会出现这种情况,并给出至少一种在Rust中处理浮点数精度问题的常用方法,最好能结合代码示例说明。
34.7万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

出现精度问题的原因

计算机使用二进制来存储数据,而浮点数采用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 类型进行精确运算,避免了浮点数的精度问题。