1use crate::prelude::*;
8
9pub trait FloatExt {
11 fn ceil_to_places(self, places: usize) -> Self;
15
16 fn floor_to_places(self, places: usize) -> Self;
20
21 fn round_to_places(self, places: usize) -> Self;
25}
26
27fn places_f32(places: usize) -> f32 {
29 assert!(places < i32::MAX as usize, "`places` must be less than {}", i32::MAX);
30
31 match places {
32 0 => 1.0,
33 1 => 10.0,
34 2 => 100.0,
35 3 => 1000.0,
36 n => 10.0f32.powi(n as i32),
37 }
38}
39
40fn places_f64(places: usize) -> f64 {
42 assert!(places < i32::MAX as usize, "`places` must be less than {}", i32::MAX);
43
44 match places {
45 0 => 1.0,
46 1 => 10.0,
47 2 => 100.0,
48 3 => 1000.0,
49 n => 10.0f64.powi(n as i32),
50 }
51}
52
53impl FloatExt for f32 {
54 fn ceil_to_places(self, places: usize) -> Self {
55 let mult = places_f32(places);
56
57 (self * mult).ceil() / mult
58 }
59
60 fn floor_to_places(self, places: usize) -> Self {
61 let mult = places_f32(places);
62
63 (self * mult).floor() / mult
64 }
65
66 fn round_to_places(self, places: usize) -> Self {
67 let mult = places_f32(places);
68
69 (self * mult).round() / mult
70 }
71}
72
73impl FloatExt for f64 {
74 fn ceil_to_places(self, places: usize) -> Self {
75 let mult = places_f64(places);
76
77 (self * mult).ceil() / mult
78 }
79
80 fn floor_to_places(self, places: usize) -> Self {
81 let mult = places_f64(places);
82
83 (self * mult).floor() / mult
84 }
85
86 fn round_to_places(self, places: usize) -> Self {
87 let mult = places_f64(places);
88
89 (self * mult).round() / mult
90 }
91}