double b = a/100000;
b = (int) b;
b *= 100000;
W jaki sposób powyższy kod C jest konwertowany na rdzeń? Zwłaszcza linia # 2, która zaokrągla liczbę.Konwersja liczby zmiennoprzecinkowej na liczbę całkowitą w Rust
double b = a/100000;
b = (int) b;
b *= 100000;
W jaki sposób powyższy kod C jest konwertowany na rdzeń? Zwłaszcza linia # 2, która zaokrągla liczbę.Konwersja liczby zmiennoprzecinkowej na liczbę całkowitą w Rust
Szczególnie linia nr 2, która zaokrągla liczbę.
Po pierwsze: to nie jest prawda. Aby "zaokrąglić" liczbę rzeczywistą, należy zwrócić najbliższą liczbę całkowitą. Przekonwertowałeś go na int
, który odrzuca wszystkie niecałkowate części.
Ale tutaj jest odpowiednikiem Rust Twojego dokładnego kodu (zakładając a
ma typ f64
):
let b = a/100_000.0; // underscore in number to increase readability
let b = b as i64;
let b = b * 100_000;
Który, oczywiście, może być napisana w jednym wierszu, TOO:
let b = ((a/100_000.0) as i64) * 100_000;
Jeśli chcesz zaokrąglić, zamiast po prostu brać część całkowitą, możesz użyć metody round
z f64
:
let b = ((a/100_000.0).round() as i64) * 100_000;
pamiętać, że istnieją również trunc
, ceil
i floor
. Możesz użyć jednej z tych metod, aby dokładnie kontrolować, co się dzieje, zamiast polegać na obsadzie. From the Rust book możemy się nauczyć:
Rzucanie z liczby zmiennoprzecinkowej na liczbę całkowitą spowoduje zaokrąglenie wartości zmiennoprzecinkowej do zera.
Takie zachowanie jest równoznaczne trunc
, ale jeśli zachowanie ma znaczenie dla ciebie, powinieneś użyć trunc
do ...
To jest przykład rundy w Rust. Trzeba napisać stałych numerycznych prawy typ one: na przykład jeśli d jest F64 i chcesz pomnożyć przez 10 prawo konferencyjnym jest napisać: D * 10,0 zamiast: D * 10
i jawnie zdefiniuj typ zmiennej, aby funkcja okrągła była dostępna w tych przypadkach.
let a = 2e50;
let mut b : f64 = a/100000.0;
b = b.round();
println!("{}", b);
Aby rzucić pływaka do liczby całkowitej, można użyć as
. Na przykład:
let b = (a/100000.0) as i64;