injective_math/fp_decimal/
scale.rs

1use crate::fp_decimal::FPDecimal;
2
3pub const DEC_SCALE_FACTOR: i32 = 18;
4
5pub trait Scaled {
6    fn scaled(self, digits: i32) -> Self;
7}
8
9impl Scaled for FPDecimal {
10    fn scaled(self, digits: i32) -> Self {
11        self.to_owned() * FPDecimal::from(10i128).pow(FPDecimal::from(digits as i128)).unwrap()
12    }
13}
14
15pub fn dec_scale_factor() -> FPDecimal {
16    FPDecimal::ONE.scaled(DEC_SCALE_FACTOR)
17}
18
19#[cfg(test)]
20mod tests {
21    use crate::fp_decimal::scale::{dec_scale_factor, Scaled};
22    use crate::FPDecimal;
23
24    #[test]
25    fn test_scale_descale() {
26        let val = FPDecimal::must_from_str("1000000000000000000");
27        let descaled = val.scaled(-18);
28        assert_eq!(descaled, FPDecimal::must_from_str("1"), "FPDecimal wasn't correctly scaled down");
29        let scaled = descaled.scaled(18);
30        assert_eq!(scaled, val, "FPDecimal wasn't correctly scaled up");
31    }
32
33    #[test]
34    fn test_scale_factor() {
35        assert_eq!(dec_scale_factor(), FPDecimal::must_from_str("1000000000000000000"));
36    }
37}