injective_math/fp_decimal/
scale.rs

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