You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

直接使用表达式与接收f32的闭包计算为何存在数值差异?

为何两段浮点计算结果存在数值差异?

代码示例

let average = |a: f32, b: f32, c: f32| {
    (a + b + c) / 3.0
};

println!("With function: {}", average(11.0, -22.0, 33.0));
println!("Without function: {}", (11.0 - 22.0 + 33.0) / 3.0);

运行输出

With function: 7.3333335
Without function: 7.333333333333333

差异原因

这是因为两段代码使用了不同精度的浮点数类型:

  • 闭包average的参数被显式声明为f32(单精度浮点数),整个计算过程基于单精度执行。单精度浮点数仅能提供约7位十进制有效数字的精度,无法精确表示22/3这样的无限循环小数,最终存储的近似值为7.3333335。
  • 第二行的直接计算中,所有浮点字面量(11.0、-22.0等)在Rust里默认是f64(双精度浮点数)。双精度拥有约15-17位十进制有效数字的精度,能更精准地逼近22/3的真实值,因此输出结果为7.333333333333333。

如果要让两者结果一致,要么把闭包的参数类型改为f64,要么给直接计算里的字面量加上f32后缀(比如11.0f32),统一浮点数精度即可。


内容的提问来源于stack exchange,提问作者CocDap

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 18:50:42