#numbers #duration #round #rounding #no-alloc

no-std roundable

Round numbers and durations to a given factor

3 unstable releases

0.2.0 Mar 18, 2024
0.1.1 Mar 15, 2024
0.1.0 Mar 14, 2024

#145 in Date and time

Download history 242/week @ 2024-03-09 172/week @ 2024-03-16 20/week @ 2024-03-23 33/week @ 2024-03-30 2/week @ 2024-04-06

62 downloads per month

MIT/Apache

50KB
652 lines

Round numbers and durations to a given factor

docs.rs Crates.io Rust version 1.56.1+

This provides an implementation of rounding for various values, including the native number types and core::time::Duration (also known as std::time::Duration).

The Roundable trait adds the following functions to roundable values:

Example

use roundable::{Roundable, Tie};

assert!(310 == 314.round_to(10, Tie::Up));
assert!(300.0 == 314.1.round_to(100.0, Tie::Up));

// To avoid panicking on overflow:
assert!(Some(260) == 255.try_round_to(10, Tie::Up));
assert!(None == 255u8.try_round_to(10, Tie::Up));

Tie strategies

“Ties” are numbers exactly halfway between two round numbers, e.g. 0.5 when rounding to the nearest whole number. Traditionally, ties are resolved by picking the higher number, but there are other strategies. Roundable supports the following rules:

Rounding Duration

Duration can be rounded to a Duration factor, just like a number type. For convenience, there are a number of constants that can be used to make rounding Duration easier.

use roundable::{SECOND, MINUTE, Roundable, Tie};
use std::time::Duration;

assert!(Duration::ZERO == Duration::from_millis(314).round_to(SECOND, Tie::Up));
assert!(MINUTE == Duration::from_millis(59_500).round_to(SECOND, Tie::Up));

#![no_std] by default

You can use this crate with or without std and alloc. You do not need to enable or disable features either way.

⚠️ Development status

This is in active development. The API may be entirely rewritten. I am open to suggestions.

Minimum supported Rust version

Currently the minimum supported Rust version (MSRV) is 1.56.1. Future increases in the MSRV will require a major version bump.

License

This project dual-licensed under the Apache 2 and MIT licenses. You may choose to use either.

Contributions

Unless you explicitly state otherwise, any contribution you submit as defined in the Apache 2.0 license shall be dual licensed as above, without any additional terms or conditions.

No runtime deps