我已经对例如货币处理进行了一些测试。去和飞镖。基本上,我认为处理货币的最佳方法是将双精度转换为整数,以便所有计算都是使用整数进行的,我认为这是可接受的方式。但是,不同的语言会将转换视为不同的整数。例如,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;
}
在做了一些更多的测试之后,我觉得以下是使用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;
}
我对此非常满意,因为这是我在其他地方处理它的方式,但我会测试更多。
答案 0 :(得分:10)
fn currency_double_to_int(amount: f64) -> i64 {
(amount * 100.0).round() as i64
}
这样你应该每次都得到标准的舍入而不是截断。我怀疑,舍入与libc rounding相同。另请参阅this playpen进行一些演示。