snippetrustCritical
Convert float to integer in Rust
Viewed 0 times
rustconvertintegerfloat
Problem
double b = a / 100000;
b = (int) b;
b *= 100000;How the above C code is converted to Rust? Especially the line #2 that rounds the number.
Solution
Especially the line #2 that rounds the number.
First of all: this is not true. To "round" a real number is to return the nearest integer. You just convert it to
But here is the Rust equivalent of your exact code (assuming
Which, of course, can be written in one line, too:
If you wanted to round instead of just taking the integer part, you can use the
Note that there are also
Casting from a float to an integer will round the float towards zero.
This behavior is equivalent to
First of all: this is not true. To "round" a real number is to return the nearest integer. You just convert it to
int which discards all the non-integer parts. But here is the Rust equivalent of your exact code (assuming
a has the type f64):let b = a / 100_000.0; // underscore in number to increase readability
let b = b as i64;
let b = b * 100_000;Which, of course, can be written in one line, too:
let b = ((a / 100_000.0) as i64) * 100_000;If you wanted to round instead of just taking the integer part, you can use the
round method of f64:let b = ((a / 100_000.0).round() as i64) * 100_000;Note that there are also
trunc, ceil and floor. You can use one of those methods to exactly control what happens instead of relying on the cast. From the Rust book we can learn:Casting from a float to an integer will round the float towards zero.
This behavior is equivalent to
trunc, but if the behavior does matter to you, you should use trunc to ...- ... express your intent in code
- ... have valid semantics even if the Rust compiler changes the cast semantics
Code Snippets
let b = a / 100_000.0; // underscore in number to increase readability
let b = b as i64;
let b = b * 100_000;let b = ((a / 100_000.0) as i64) * 100_000;let b = ((a / 100_000.0).round() as i64) * 100_000;Context
Stack Overflow Q#37506672, score: 119
Revisions (0)
No revisions yet.