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}