Rust中u128与u64相乘结果恒为0的问题咨询
问题原因
你当前代码的异常是由Rust整数除法的截断特性导致的:两个整数执行除法运算时会默认向零截断,只要ending_time - starting_time的取值小于duration,(ending_time - starting_time)/duration的结果就会直接被截断为0,因此无论amount取值多大,最终相乘结果都会是0。
修复方案
调整运算顺序,先执行乘法再执行除法,同时统一将时间相关参数转换为u128类型避免溢出,修复后代码如下:
fn calculate_weight(amount: u128, starting_time: u64, ending_time: u64, duration: u64) -> u128 { let time_passed = (ending_time - starting_time) as u128; let duration_u128 = duration as u128; // 先乘后除避免整数提前截断导致精度损失 amount * time_passed / duration_u128 }
效果验证
按照你给出的业务场景测试:
- Alice在0时刻参与,
time_passed = duration,计算结果为30000 * duration / duration = 30000,符合100%权重的预期 - Bob在周期过半时参与,
time_passed = duration/2,计算结果为30000 * (duration/2) / duration = 15000,符合50%权重的预期
可选扩展
如果业务需要支持四舍五入或者向上取整,可以调整除法逻辑:
- 四舍五入:
(amount * time_passed + duration_u128 / 2) / duration_u128 - 向上取整:
(amount * time_passed + duration_u128 - 1) / duration_u128
内容的提问来源于stack exchange,提问作者Haseeb Saeed
相关产品推荐
相关产品推荐

