web-dev-qa-db-fra.com

Convertir flottant en entier dans Rust

double b = a / 100000;
b = (int) b;
b *= 100000;

Comment le code C ci-dessus est converti en Rust? Surtout la ligne # 2 qui arrondit le nombre.

20
exebook

Surtout la ligne # 2 qui arrondit le nombre.

Tout d'abord: ce n'est pas vrai. "Arrondir" un nombre réel revient à renvoyer l'entier le plus proche. Vous venez de le convertir en int qui supprime toutes les parties non entières.


Mais voici l'équivalent Rust de votre code exact (en supposant que a a le type f64):

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

Ce qui, bien sûr, peut également être écrit sur une seule ligne:

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

Si vous souhaitez arrondir au lieu de simplement prendre la partie entière, vous pouvez utiliser la méthode round de f64:

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

Notez qu'il existe également trunc , ceil et floor . Vous pouvez utiliser l'une de ces méthodes pour contrôler exactement ce qui se passe au lieu de vous fier à la distribution. À partir du livre Rust nous pouvons apprendre:

La conversion d'un flottant en un entier arrondira le flotteur vers zéro.

Ce comportement est équivalent à trunc, mais si le comportement vous importe, vous devez utiliser trunc pour ...

  1. ... exprimer votre intention dans le code
  2. ... ont une sémantique valide même si le compilateur Rust modifie la sémantique de transtypage
30
Lukas Kalbertodt

Pour convertir un flottant en un entier, vous pouvez utiliser as . Par exemple:

let b = (a / 100000.0) as i64;
7
deepmax

Ceci est un exemple de rond en rouille. Vous devez écrire des constantes numériques à droite du type qu'elles sont: par exemple si d est f64 et vous voulez le multiplier par 10, la bonne convention est d'écrire: d * 10.0 au lieu de: d * 10

et définissez explicitement le type de votre variable pour rendre la fonction ronde disponible dans ce cas.

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