代码:
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
为什么它们不同?
差异来自于使用不同的类型来计算相同的数学表达式。闭包使用f32
s(如注释所示),而没有它的版本使用f64
s。带有小数的数字字面值的类型默认为f64
,除非推断或附加后缀。
所以后者的精度是前者的两倍。如果用f64
s来注释闭包,您将得到相同的结果:
let average = |a: f64, b: f64, c: f64| {
(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.333333333333333
Without function: 7.333333333333333