Rust如何处理f64到i64的转换?

时间:2013-10-26 13:58:32

标签: rust

我已经对例如货币处理进行了一些测试。去和飞镖。基本上,我认为处理货币的最佳方法是将双精度转换为整数,以便所有计算都是使用整数进行的,我认为这是可接受的方式。但是,不同的语言会将转换视为不同的整数。例如,Go截断双打因此,我认为有必要添加舍入因子来补偿。使用Rust,我发现执行直接转换(见下文)似乎有效,但我不确定Rust实际上如何处理转换使用似乎是处理转换的两种替代方法。

Rust如何处理f64到i64的舍入以及使用的最佳方法 - “as i64”或“to_i64()”?

根据我所做的时间,这里的两种方法看起来并不相同,但结果可能是。 (“因为i64”出现的速度略快)。

示例(简化为仅使用2个小数位 - 单一货币):

fn fCcyDblToInt(dCcyAmt: f64) -> i64 {
 //  return (dCcyAmt * 100.0).to_i64(); 
 return (dCcyAmt * 100.0) as i64;
}

在首次发布后14小时编辑:

在做了一些更多的测试之后,我觉得以下是使用Rust处理float到整数转换的方法:

fn fCcyDblToInt(dCcyAmt:f64) -> i64 {
  let dRound: f64 = if dCcyAmt > 0.0 { 0.5 } else if dCcyAmt < 0.0 {-0.5 } else {0.0};
 // return ((dCcyAmt * 100.0) +dRound).to_i64();
  return ((dCcyAmt * 100.0) +dRound) as i64;      
}

我对此非常满意,因为这是我在其他地方处理它的方式,但我会测试更多。

1 个答案:

答案 0 :(得分:10)

f64有一个round方法因此你可以这样做:

fn currency_double_to_int(amount: f64) -> i64 {
    (amount * 100.0).round() as i64
}

这样你应该每次都得到标准的舍入而不是截断。我怀疑,舍入与libc rounding相同。另请参阅this playpen进行一些演示。