2016-05-29 26 views
7
double b = a/100000; 
b = (int) b; 
b *= 100000; 

Come il codice C sopra riportato viene convertito in Ruggine? Soprattutto la linea n. 2 che arrotonda il numero.Converti float in intero in Rust

risposta

14

Soprattutto la linea # 2 che arrotonda il numero.

Prima di tutto: questo non è vero. Per "arrotondare" un numero reale è necessario restituire il numero intero più vicino. Devi solo convertirlo in int che scarta tutte le parti non interi.


Ma qui è l'equivalente della ruggine del codice esatto (supponendo a ha il tipo di f64):

let b = a/100_000.0; // underscore in number to increase readability 
let b = b as i64; 
let b = b * 100_000; 

Il che, naturalmente, può essere scritto in una sola riga, anche:

let b = ((a/100_000.0) as i64) * 100_000; 

Se si desidera arrotondare anziché prendere solo la parte intera, è possibile utilizzare il metodo round di f64:

let b = ((a/100_000.0).round() as i64) * 100_000; 

Nota che ci sono anche trunc, ceil e floor. Puoi usare uno di questi metodi per controllare esattamente cosa succede invece di fare affidamento sul cast. From the Rust book possiamo imparare:

La trasmissione da un valore float a un intero consente di arrotondare il galleggiante verso zero.

Questo comportamento è equivalente a trunc, ma se il comportamento non importa a voi, è necessario utilizzare trunc per ...

  1. ... esprimere il tuo intento nel codice
  2. ... avere una semantica valida anche se il compilatore di Rust cambia la semantica del cast
2

Questo è un esempio di rotondo in ruggine. Devi scrivere le costanti numeriche proprio il tipo che sono: per esempio se d è F64 e si desidera moltiplicarlo per 10 la convenzione giusto è quello di scrivere: D * 10.0 invece di: d * 10

e definire esplicitamente il tipo della variabile per rendere disponibile la funzione round in questo caso.

let a = 2e50; 
let mut b : f64 = a/100000.0; 
b = b.round(); 
println!("{}", b); 
3

di gettare un galleggiante in un intero, è possibile utilizzare as. Per esempio:

let b = (a/100000.0) as i64;