Convert float to integer in Rust

后端 未结 3 1349
鱼传尺愫
鱼传尺愫 2021-02-03 19:02
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.

3条回答
  •  渐次进展
    2021-02-03 19:21

    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 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 ...

    1. ... express your intent in code
    2. ... have valid semantics even if the Rust compiler changes the cast semantics

提交回复
热议问题