RoundMode

Enum RoundMode 

Source
#[non_exhaustive]
pub enum RoundMode { Ceil, Floor, Expand, Trunc, HalfCeil, HalfFloor, HalfExpand, HalfTrunc, HalfEven, }
Expand description

The mode for dealing with the remainder when rounding datetimes or spans.

This is used in APIs like Span::round for rounding spans, and APIs like Zoned::round for rounding datetimes.

In the documentation for each variant, we refer to concepts like the “smallest” unit and the “rounding increment.” These are best described in the documentation for what you’re rounding. For example, SpanRound::smallest and SpanRound::increment.

§Example

This shows how to round a span with a different rounding mode than the default:

use jiff::{RoundMode, SpanRound, ToSpan, Unit};

// The default rounds like how you were taught in school:
assert_eq!(
    1.hour().minutes(59).round(Unit::Hour)?,
    2.hours().fieldwise(),
);
// But we can change the mode, e.g., truncation:
let options = SpanRound::new().smallest(Unit::Hour).mode(RoundMode::Trunc);
assert_eq!(
    1.hour().minutes(59).round(options)?,
    1.hour().fieldwise(),
);

Variants (Non-exhaustive)§

This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

Ceil

Rounds toward positive infinity.

For negative spans and datetimes, this option will make the value smaller, which could be unexpected. To round away from zero, use Expand.

§

Floor

Rounds toward negative infinity.

This mode acts like Trunc for positive spans and datetimes, but for negative values it will make the value larger, which could be unexpected. To round towards zero, use Trunc.

§

Expand

Rounds away from zero like Ceil for positive spans and datetimes, and like Floor for negative spans and datetimes.

§

Trunc

Rounds toward zero, chopping off any fractional part of a unit.

This is the default when rounding spans returned from datetime arithmetic. (But it is not the default for Span::round.)

§

HalfCeil

Rounds to the nearest allowed value like HalfExpand, but when there is a tie, round towards positive infinity like Ceil.

§

HalfFloor

Rounds to the nearest allowed value like HalfExpand, but when there is a tie, round towards negative infinity like Floor.

§

HalfExpand

Rounds to the nearest value allowed by the rounding increment and the smallest unit. When there is a tie, round away from zero like Ceil for positive spans and datetimes and like Floor for negative spans and datetimes.

This corresponds to how rounding is often taught in school.

This is the default for rounding spans and datetimes.

§

HalfTrunc

Rounds to the nearest allowed value like HalfExpand, but when there is a tie, round towards zero like Trunc.

§

HalfEven

Rounds to the nearest allowed value like HalfExpand, but when there is a tie, round towards the value that is an even multiple of the rounding increment. For example, with a rounding increment of 3, the number 10 would round up to 12 instead of down to 9, because 12 is an even multiple of 3, where as 9 is is an odd multiple.

Implementations§

Source§

impl RoundMode

Source

pub(crate) fn round_by_duration( self, quantity: SignedDuration, increment: SignedDuration, ) -> Result<SignedDuration, Error>

Round quantity to the nearest increment using this rounding mode.

If this the rounding result would overflow SignedDuration, then an error is returned.

Callers should generally prefer higher level APIs. But this one is unavoidable when the increment isn’t tied to an invariant length and can vary.

§Panics

Callers must ensure that increment has a number of nanoseconds greater than or equal to 1.

Source

fn round_by_i128(self, quantity: i128, increment: i128) -> i128

The internal API that does the actual rounding.

This does not error on overflow because callers can never use values close to the i128 limits. If an overflow would otherwise occur due to rounding, then it saturates instead of panicking or returning an error.

I wish we could do modulus on SignedDuration directly. Then we wouldn’t need 128-bit arithmetic at all. But I looked into making SignedDuration % SignedDuration work, and it was quite involved? So I guess we should just let the compiler handle it for i128. We’d also need division.

§Panics

When increment < 1.

Trait Implementations§

Source§

impl Clone for RoundMode

Source§

fn clone(&self) -> RoundMode

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for RoundMode

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for RoundMode

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for RoundMode

Source§

fn eq(&self, other: &RoundMode) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Copy for RoundMode

Source§

impl Eq for RoundMode

Source§

impl StructuralPartialEq for RoundMode

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.