double b = a / 100000; b = (int) b; b *= 100000;
上面的C代码是如何转换成Rust的?特别是第2行的舍入。
rqenqsqc1#
特别是对数字进行舍入的第2行。首先是:这是不正确的。“舍入”一个真实的是返回最接近的整数。你只是把它转换成int,它丢弃了所有的非整数部分。但下面是Rust的等价代码(假设a的类型为f64):
int
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;
如果您想要四舍五入而不是只取整数部分,可以使用f64的round方法:
round
let b = ((a / 100_000.0).round() as i64) * 100_000;
请注意,还有trunc,ceil和floor。你可以使用其中的一种方法来精确控制发生的事情,而不依赖于铸造。从Rust书中我们可以了解到:从float转换为integer会将float数值修约为零。这个行为相当于trunc,但是如果这个行为对您很重要,您应该使用trunc来...1....用代码表达您的意图1....具有有效语义,即使Rust编译器更改了强制转换语义
trunc
ceil
floor
elcex8rz2#
若要将浮点数转换为整数,可以使用as。例如:
as
let b = (a / 100000.0) as i64;
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);
3条答案
按热度按时间rqenqsqc1#
特别是对数字进行舍入的第2行。
首先是:这是不正确的。“舍入”一个真实的是返回最接近的整数。你只是把它转换成
int
,它丢弃了所有的非整数部分。但下面是Rust的等价代码(假设
a
的类型为f64
):当然,也可以用一行字来写:
如果您想要四舍五入而不是只取整数部分,可以使用
f64
的round
方法:请注意,还有
trunc
,ceil
和floor
。你可以使用其中的一种方法来精确控制发生的事情,而不依赖于铸造。从Rust书中我们可以了解到:从float转换为integer会将float数值修约为零。
这个行为相当于
trunc
,但是如果这个行为对您很重要,您应该使用trunc
来...1....用代码表达您的意图
1....具有有效语义,即使Rust编译器更改了强制转换语义
elcex8rz2#
若要将浮点数转换为整数,可以使用
as
。例如:krcsximq3#
这是Rust中round的一个例子。你必须写出正确类型的数值常量:例如,如果d是f64,并且您想将其乘以10,则正确的约定是写为:d * 10.0,而不是:d * 10
并显式定义变量的类型以使round函数在这种情况下可用。