/rust/registry/src/index.crates.io-1949cf8c6b5b557f/fastnum-0.7.4/src/decimal/round.rs
Line | Count | Source |
1 | | use core::cmp::Ordering::{Equal, Greater, Less}; |
2 | | |
3 | | use crate::decimal::{ |
4 | | RoundingMode::{self, *}, |
5 | | Sign, |
6 | | }; |
7 | | |
8 | | // TODO: refactor |
9 | 0 | pub(crate) fn round_pair_digits( |
10 | 0 | pair: (u8, u8), |
11 | 0 | sign: Sign, |
12 | 0 | rounding_mode: RoundingMode, |
13 | 0 | trailing_zeros: bool, |
14 | 0 | ) -> u8 { |
15 | 0 | let (lhs, rhs) = pair; |
16 | | // if all zero after digit, never round |
17 | 0 | if rhs == 0 && trailing_zeros { |
18 | 0 | return lhs; |
19 | 0 | } |
20 | 0 | let up = lhs + 1; |
21 | 0 | let down = lhs; |
22 | 0 | match (rounding_mode, rhs.cmp(&5)) { |
23 | 0 | (No, _) => down, |
24 | 0 | (Up, _) => up, |
25 | 0 | (Down, _) => down, |
26 | | (Floor, _) => { |
27 | 0 | if sign == Sign::Minus { |
28 | 0 | up |
29 | | } else { |
30 | 0 | down |
31 | | } |
32 | | } |
33 | | (Ceiling, _) => { |
34 | 0 | if sign == Sign::Minus { |
35 | 0 | down |
36 | | } else { |
37 | 0 | up |
38 | | } |
39 | | } |
40 | 0 | (_, Less) => down, |
41 | 0 | (_, Greater) => up, |
42 | 0 | (_, Equal) if !trailing_zeros => up, |
43 | 0 | (HalfUp, Equal) => up, |
44 | 0 | (HalfDown, Equal) => down, |
45 | | (HalfEven, Equal) => { |
46 | 0 | if lhs % 2 == 0 { |
47 | 0 | down |
48 | | } else { |
49 | 0 | up |
50 | | } |
51 | | } |
52 | | } |
53 | 0 | } |