在Rust中将浮点数转换为整数

sqxo8psd  于 2022-11-30  发布在  其他
关注(0)|答案(3)|浏览(215)
double b = a / 100000;
b = (int) b;
b *= 100000;

上面的C代码是如何转换成Rust的?特别是第2行的舍入。

rqenqsqc

rqenqsqc1#

特别是对数字进行舍入的第2行。
首先是:这是不正确的。“舍入”一个真实的是返回最接近的整数。你只是把它转换成int,它丢弃了所有的非整数部分。
但下面是Rust的等价代码(假设a的类型为f64):

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;

如果您想要四舍五入而不是只取整数部分,可以使用f64round方法:

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

请注意,还有truncceilfloor。你可以使用其中的一种方法来精确控制发生的事情,而不依赖于铸造。从Rust书中我们可以了解到:
从float转换为integer会将float数值修约为零。
这个行为相当于trunc,但是如果这个行为对您很重要,您应该使用trunc来...
1....用代码表达您的意图
1....具有有效语义,即使Rust编译器更改了强制转换语义

elcex8rz

elcex8rz2#

若要将浮点数转换为整数,可以使用as。例如:

let b = (a / 100000.0) as i64;
krcsximq

krcsximq3#

这是Rust中round的一个例子。你必须写出正确类型的数值常量:例如,如果d是f64,并且您想将其乘以10,则正确的约定是写为:d * 10.0,而不是:d * 10
并显式定义变量的类型以使round函数在这种情况下可用。

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

相关问题