mars_core/math/
mod.rs

1pub mod decimal;
2
3use cosmwasm_std::{StdResult, Uint128};
4
5pub fn uint128_checked_div_with_ceil(
6    numerator: Uint128,
7    denominator: Uint128,
8) -> StdResult<Uint128> {
9    let mut result = numerator.checked_div(denominator)?;
10
11    if numerator.checked_rem(denominator)? > Uint128::zero() {
12        result += Uint128::from(1_u128);
13    }
14
15    Ok(result)
16}
17
18#[cfg(test)]
19mod tests {
20    use super::*;
21    #[test]
22    fn test_uint128_checked_div_with_ceil() {
23        let a = Uint128::new(120u128);
24        let b = Uint128::zero();
25        uint128_checked_div_with_ceil(a, b).unwrap_err();
26
27        let a = Uint128::new(120u128);
28        let b = Uint128::new(60_u128);
29        let c = uint128_checked_div_with_ceil(a, b).unwrap();
30        assert_eq!(c, Uint128::new(2u128));
31
32        let a = Uint128::new(120u128);
33        let b = Uint128::new(119_u128);
34        let c = uint128_checked_div_with_ceil(a, b).unwrap();
35        assert_eq!(c, Uint128::new(2u128));
36
37        let a = Uint128::new(120u128);
38        let b = Uint128::new(120_u128);
39        let c = uint128_checked_div_with_ceil(a, b).unwrap();
40        assert_eq!(c, Uint128::new(1u128));
41
42        let a = Uint128::new(120u128);
43        let b = Uint128::new(121_u128);
44        let c = uint128_checked_div_with_ceil(a, b).unwrap();
45        assert_eq!(c, Uint128::new(1u128));
46
47        let a = Uint128::zero();
48        let b = Uint128::new(121_u128);
49        let c = uint128_checked_div_with_ceil(a, b).unwrap();
50        assert_eq!(c, Uint128::zero());
51    }
52}