Ce face f64
f64 reține numere cu zecimale cu aproximativ 15-17 cifre semnificative. Este tipul ales automat pentru let x = 2.5;. Există și f32, cu precizie mai mică. Literalii folosesc punctul zecimal (3.14), iar 2.5e-3 înseamnă 0.0025.
Multe valori zecimale (0.1, 0.2) nu pot fi reprezentate exact în binar, deci apar mici erori: 0.1 + 0.2 nu este exact 0.3. De aceea numerele f64 se compară cu o toleranță, iar sumele de bani se țin de obicei în întregi (bani, cenți).
Împărțirea la zero nu dă panică: rezultatul este inf, -inf sau NaN (not a number). Conversia x as i32 taie zecimalele și se oprește la limitele tipului; NaN devine 0.
Ce returnează
Este un tip, nu o funcție.
Exemple
Exemplul 1: Precizie și comparare
fn main() {
let suma: f64 = 0.1 + 0.2;
println!("0.1 + 0.2 = {suma}");
println!("egal cu 0.3: {}", suma == 0.3);
println!("aproape egal: {}", (suma - 0.3).abs() < 1e-9);
println!("cu 2 zecimale: {suma:.2}");
println!("EPSILON = {:e}", f64::EPSILON);
println!("MAX = {:e}", f64::MAX);
}
Rezultat
0.1 + 0.2 = 0.30000000000000004
egal cu 0.3: false
aproape egal: true
cu 2 zecimale: 0.30
EPSILON = 2.220446049250313e-16
MAX = 1.7976931348623157e308
Exemplul 2: Infinit, NaN și conversii
fn main() {
let zero = 0.0_f64;
println!("1 / 0 = {}", 1.0 / zero);
println!("-1 / 0 = {}", -1.0 / zero);
println!("0 / 0 = {}", zero / zero);
println!("9.99 as i32 = {}", 9.99_f64 as i32);
println!("-9.99 as i32 = {}", -9.99_f64 as i32);
println!("NaN as i32 = {}", f64::NAN as i32);
println!("1e20 as i32 = {}", 1e20_f64 as i32);
println!("{:?}", "3,5".parse::<f64>().is_err());
}
Rezultat
1 / 0 = inf
-1 / 0 = -inf
0 / 0 = NaN
9.99 as i32 = 9
-9.99 as i32 = -9
NaN as i32 = 0
1e20 as i32 = 2147483647
true
Greșeli frecvente
- Compari cu
==rezultate de calcul:0.1 + 0.2 == 0.3estefalse. Compară diferența cu o toleranță. - Ții sume de bani în
f64: rotunjirile se adună. Folosește întregi (bani) sau un tip zecimal dintr-un crate. - Încerci
vec.sort()sauiter().max()pef64: nu compilează, pentru căf64nu implementeazăOrd(din cauza luiNaN). Foloseștesort_by(f64::total_cmp)saufold(f64::NEG_INFINITY, f64::max).
Comenzi înrudite
f64::round: Rotunjiri: round la cel mai apropiat întreg, floor în jos, ceil în sus, trunc tăie zecimalele.f64::is_nan: Verifică dacă valoarea este NaN („nu e număr”), singurul mod sigur, pentru că NaN nu este egal nici cu el însuși.f64::min: min returnează cel mai mic dintre două numere, max cel mai mare; dacă unul este NaN, îl ignoră.i32: Tipul implicit pentru numere întregi cu semn, pe 32 de biți: de la -2147483648 la 2147483647.