MST

星途 面试题库

面试题:Rust中浮点数精度问题之基本运算

在Rust中,给定两个浮点数`a = 0.1`和`b = 0.2`,执行`a + b`操作,你预期的结果是什么,实际结果是什么?并解释产生差异的原因。如何解决这个精度问题?
12.9万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 预期结果: 预期结果是0.3,因为按照常规的数学运算,0.1 + 0.2 的和是 0.3
  2. 实际结果: 在Rust中执行 a + b,实际结果接近但不等于 0.3,如 0.30000000000000004。示例代码如下:
fn main() {
    let a = 0.1;
    let b = 0.2;
    let result = a + b;
    println!("{}", result);
}
  1. 差异原因: 这是由于浮点数在计算机中采用二进制表示法。十进制小数(如 0.10.2)在二进制中可能无法精确表示,会产生无限循环的二进制小数。计算机在存储这些小数时会进行截断和近似,导致计算结果存在精度误差。
  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 库可以实现高精度的浮点数运算,解决精度问题。