#[inline]
pub fn round<T: Float>(number: T, decimal_places: u32) -> T {
number.round_dp(decimal_places)
}
#[inline]
pub fn round_zeros<T: Roundable>(number: T, zeros: u32) -> T {
number.round_zeros(zeros)
}
#[inline]
pub fn ceil<T: Float>(number: T, decimal_places: u32) -> T {
number.ceil_dp(decimal_places)
}
#[inline]
pub fn ceil_zeros<T: Roundable>(number: T, zeros: u32) -> T {
number.ceil_zeros(zeros)
}
#[inline]
pub fn floor<T: Float>(number: T, decimal_places: u32) -> T {
number.floor_dp(decimal_places)
}
#[inline]
pub fn floor_zeros<T: Roundable>(number: T, zeros: u32) -> T {
number.floor_zeros(zeros)
}
#[inline]
pub fn round_sf<T: Roundable>(number: T, sig_figs: u32) -> T {
number.round_sf(sig_figs)
}
#[inline]
pub fn ceil_sf<T: Roundable>(number: T, sig_figs: u32) -> T {
number.ceil_sf(sig_figs)
}
#[inline]
pub fn floor_sf<T: Roundable>(number: T, sig_figs: u32) -> T {
number.floor_sf(sig_figs)
}
pub trait Float {
fn round_dp(self, decimal_places: u32) -> Self;
fn ceil_dp(self, decimal_places: u32) -> Self;
fn floor_dp(self, decimal_places: u32) -> Self;
}
impl Float for f32 {
#[inline]
fn round_dp(self, decimal_places: u32) -> f32 {
let power = 10_f32.powi(decimal_places as i32);
(self * power).round() / power
}
#[inline]
fn ceil_dp(self, decimal_places: u32) -> f32 {
let power = 10_f32.powi(decimal_places as i32);
(self * power).ceil() / power
}
#[inline]
fn floor_dp(self, decimal_places: u32) -> f32 {
let power = 10_f32.powi(decimal_places as i32);
(self * power).floor() / power
}
}
impl Float for f64 {
#[inline]
fn round_dp(self, decimal_places: u32) -> f64 {
let power = 10_f64.powi(decimal_places as i32);
(self * power).round() / power
}
#[inline]
fn ceil_dp(self, decimal_places: u32) -> f64 {
let power = 10_f64.powi(decimal_places as i32);
(self * power).ceil() / power
}
#[inline]
fn floor_dp(self, decimal_places: u32) -> f64 {
let power = 10_f64.powi(decimal_places as i32);
(self * power).floor() / power
}
}
pub trait Roundable {
fn round_zeros(self, zeros: u32) -> Self;
fn ceil_zeros(self, zeros: u32) -> Self;
fn floor_zeros(self, zeros: u32) -> Self;
fn round_sf(self, sig_figs: u32) -> Self;
fn ceil_sf(self, sig_figs: u32) -> Self;
fn floor_sf(self, sig_figs: u32) -> Self;
#[doc(hidden)]
fn get_digits(&self) -> u32;
}
impl Roundable for f32 {
#[inline]
fn round_zeros(self, zeros: u32) -> f32 {
let power = 10_f32.powi(zeros as i32);
(self / power).round() * power
}
#[inline]
fn ceil_zeros(self, zeros: u32) -> f32 {
let power = 10_f32.powi(zeros as i32);
(self / power).ceil() * power
}
#[inline]
fn floor_zeros(self, zeros: u32) -> f32 {
let power = 10_f32.powi(zeros as i32);
(self / power).floor() * power
}
#[inline]
fn round_sf(self, sig_figs: u32) -> Self {
let digits: i32 = self.get_digits() as i32;
let power = 10_f32.powi(digits - sig_figs as i32);
(self / power).round() * power
}
#[inline]
fn ceil_sf(self, sig_figs: u32) -> Self {
let digits: i32 = self.get_digits() as i32;
let power = 10_f32.powi(digits - sig_figs as i32);
(self / power).ceil() * power
}
#[inline]
fn floor_sf(self, sig_figs: u32) -> Self {
let digits: i32 = self.get_digits() as i32;
let power = 10_f32.powi(digits - sig_figs as i32);
(self / power).floor() * power
}
#[doc(hidden)]
#[inline]
fn get_digits(&self) -> u32 {
self.abs().log10().ceil() as u32
}
}
impl Roundable for f64 {
#[inline]
fn round_zeros(self, zeros: u32) -> f64 {
let power = 10_f64.powi(zeros as i32);
(self / power).round() * power
}
#[inline]
fn ceil_zeros(self, zeros: u32) -> f64 {
let power = 10_f64.powi(zeros as i32);
(self / power).ceil() * power
}
#[inline]
fn floor_zeros(self, zeros: u32) -> f64 {
let power = 10_f64.powi(zeros as i32);
(self / power).floor() * power
}
#[inline]
fn round_sf(self, sig_figs: u32) -> Self {
let digits: i32 = self.get_digits() as i32;
let power = 10_f64.powi(digits - sig_figs as i32);
(self / power).round() * power
}
#[inline]
fn ceil_sf(self, sig_figs: u32) -> Self {
let digits: i32 = self.get_digits() as i32;
let power = 10_f64.powi(digits - sig_figs as i32);
(self / power).ceil() * power
}
#[inline]
fn floor_sf(self, sig_figs: u32) -> Self {
let digits: i32 = self.get_digits() as i32;
let power = 10_f64.powi(digits - sig_figs as i32);
(self / power).floor() * power
}
#[doc(hidden)]
#[inline]
fn get_digits(&self) -> u32 {
self.abs().log10().ceil() as u32
}
}
impl Roundable for i8 {
#[inline]
fn round_zeros(self, zeros: u32) -> i8 {
let power = 10_f64.powi(zeros as i32);
((self as f64 / power).round() * power) as i8
}
#[inline]
fn ceil_zeros(self, zeros: u32) -> i8 {
let power = 10_f64.powi(zeros as i32);
((self as f64 / power).ceil() * power) as i8
}
#[inline]
fn floor_zeros(self, zeros: u32) -> i8 {
let power = 10_f64.powi(zeros as i32);
((self as f64 / power).floor() * power) as i8
}
#[inline]
fn round_sf(self, sig_figs: u32) -> Self {
let digits: i32 = self.get_digits() as i32;
let power = 10_f64.powi(digits - sig_figs as i32);
((self as f64 / power).round() * power) as i8
}
#[inline]
fn ceil_sf(self, sig_figs: u32) -> Self {
let digits: i32 = self.get_digits() as i32;
let power = 10_f64.powi(digits - sig_figs as i32);
((self as f64 / power).ceil() * power) as i8
}
#[inline]
fn floor_sf(self, sig_figs: u32) -> Self {
let digits: i32 = self.get_digits() as i32;
let power = 10_f64.powi(digits - sig_figs as i32);
((self as f64 / power).floor() * power) as i8
}
#[doc(hidden)]
#[inline]
fn get_digits(&self) -> u32 {
(*self as f64).abs().log10().ceil() as u32
}
}
impl Roundable for i16 {
#[inline]
fn round_zeros(self, zeros: u32) -> i16 {
let power = 10_f64.powi(zeros as i32);
((self as f64 / power).round() * power) as i16
}
#[inline]
fn ceil_zeros(self, zeros: u32) -> i16 {
let power = 10_f64.powi(zeros as i32);
((self as f64 / power).ceil() * power) as i16
}
#[inline]
fn floor_zeros(self, zeros: u32) -> i16 {
let power = 10_f64.powi(zeros as i32);
((self as f64 / power).floor() * power) as i16
}
#[inline]
fn round_sf(self, sig_figs: u32) -> Self {
let digits: i32 = self.get_digits() as i32;
let power = 10_f64.powi(digits - sig_figs as i32);
((self as f64 / power).round() * power) as i16
}
#[inline]
fn ceil_sf(self, sig_figs: u32) -> Self {
let digits: i32 = self.get_digits() as i32;
let power = 10_f64.powi(digits - sig_figs as i32);
((self as f64 / power).ceil() * power) as i16
}
#[inline]
fn floor_sf(self, sig_figs: u32) -> Self {
let digits: i32 = self.get_digits() as i32;
let power = 10_f64.powi(digits - sig_figs as i32);
((self as f64 / power).floor() * power) as i16
}
#[doc(hidden)]
#[inline]
fn get_digits(&self) -> u32 {
(*self as f64).abs().log10().ceil() as u32
}
}
impl Roundable for i32 {
#[inline]
fn round_zeros(self, zeros: u32) -> i32 {
let power = 10_f64.powi(zeros as i32);
((self as f64 / power).round() * power) as i32
}
#[inline]
fn ceil_zeros(self, zeros: u32) -> i32 {
let power = 10_f64.powi(zeros as i32);
((self as f64 / power).ceil() * power) as i32
}
#[inline]
fn floor_zeros(self, zeros: u32) -> i32 {
let power = 10_f64.powi(zeros as i32);
((self as f64 / power).floor() * power) as i32
}
#[inline]
fn round_sf(self, sig_figs: u32) -> Self {
let digits: i32 = self.get_digits() as i32;
let power = 10_f64.powi(digits - sig_figs as i32);
((self as f64 / power).round() * power) as i32
}
#[inline]
fn ceil_sf(self, sig_figs: u32) -> Self {
let digits: i32 = self.get_digits() as i32;
let power = 10_f64.powi(digits - sig_figs as i32);
((self as f64 / power).ceil() * power) as i32
}
#[inline]
fn floor_sf(self, sig_figs: u32) -> Self {
let digits: i32 = self.get_digits() as i32;
let power = 10_f64.powi(digits - sig_figs as i32);
((self as f64 / power).floor() * power) as i32
}
#[doc(hidden)]
#[inline]
fn get_digits(&self) -> u32 {
(*self as f64).abs().log10().ceil() as u32
}
}
impl Roundable for i64 {
#[inline]
fn round_zeros(self, zeros: u32) -> i64 {
let power = 10_f64.powi(zeros as i32);
((self as f64 / power).round() * power) as i64
}
#[inline]
fn ceil_zeros(self, zeros: u32) -> i64 {
let power = 10_f64.powi(zeros as i32);
((self as f64 / power).ceil() * power) as i64
}
#[inline]
fn floor_zeros(self, zeros: u32) -> i64 {
let power = 10_f64.powi(zeros as i32);
((self as f64 / power).floor() * power) as i64
}
#[inline]
fn round_sf(self, sig_figs: u32) -> Self {
let digits: i32 = self.get_digits() as i32;
let power = 10_f64.powi(digits - sig_figs as i32);
((self as f64 / power).round() * power) as i64
}
#[inline]
fn ceil_sf(self, sig_figs: u32) -> Self {
let digits: i32 = self.get_digits() as i32;
let power = 10_f64.powi(digits - sig_figs as i32);
((self as f64 / power).ceil() * power) as i64
}
#[inline]
fn floor_sf(self, sig_figs: u32) -> Self {
let digits: i32 = self.get_digits() as i32;
let power = 10_f64.powi(digits - sig_figs as i32);
((self as f64 / power).floor() * power) as i64
}
#[doc(hidden)]
#[inline]
fn get_digits(&self) -> u32 {
(*self as f64).abs().log10().ceil() as u32
}
}
impl Roundable for u8 {
#[inline]
fn round_zeros(self, zeros: u32) -> u8 {
let power = 10_f64.powi(zeros as i32);
((self as f64 / power).round() * power) as u8
}
#[inline]
fn ceil_zeros(self, zeros: u32) -> u8 {
let power = 10_f64.powi(zeros as i32);
((self as f64 / power).ceil() * power) as u8
}
#[inline]
fn floor_zeros(self, zeros: u32) -> u8 {
let power = 10_f64.powi(zeros as i32);
((self as f64 / power).floor() * power) as u8
}
#[inline]
fn round_sf(self, sig_figs: u32) -> Self {
let digits: i32 = self.get_digits() as i32;
let power = 10_f64.powi(digits - sig_figs as i32);
((self as f64 / power).round() * power) as u8
}
#[inline]
fn ceil_sf(self, sig_figs: u32) -> Self {
let digits: i32 = self.get_digits() as i32;
let power = 10_f64.powi(digits - sig_figs as i32);
((self as f64 / power).ceil() * power) as u8
}
#[inline]
fn floor_sf(self, sig_figs: u32) -> Self {
let digits: i32 = self.get_digits() as i32;
let power = 10_f64.powi(digits - sig_figs as i32);
((self as f64 / power).floor() * power) as u8
}
#[doc(hidden)]
#[inline]
fn get_digits(&self) -> u32 {
(*self as f64).abs().log10().ceil() as u32
}
}
impl Roundable for u16 {
#[inline]
fn round_zeros(self, zeros: u32) -> u16 {
let power = 10_f64.powi(zeros as i32);
((self as f64 / power).round() * power) as u16
}
#[inline]
fn ceil_zeros(self, zeros: u32) -> u16 {
let power = 10_f64.powi(zeros as i32);
((self as f64 / power).ceil() * power) as u16
}
#[inline]
fn floor_zeros(self, zeros: u32) -> u16 {
let power = 10_f64.powi(zeros as i32);
((self as f64 / power).floor() * power) as u16
}
#[inline]
fn round_sf(self, sig_figs: u32) -> Self {
let digits: i32 = self.get_digits() as i32;
let power = 10_f64.powi(digits - sig_figs as i32);
((self as f64 / power).round() * power) as u16
}
#[inline]
fn ceil_sf(self, sig_figs: u32) -> Self {
let digits: i32 = self.get_digits() as i32;
let power = 10_f64.powi(digits - sig_figs as i32);
((self as f64 / power).ceil() * power) as u16
}
#[inline]
fn floor_sf(self, sig_figs: u32) -> Self {
let digits: i32 = self.get_digits() as i32;
let power = 10_f64.powi(digits - sig_figs as i32);
((self as f64 / power).floor() * power) as u16
}
#[doc(hidden)]
#[inline]
fn get_digits(&self) -> u32 {
(*self as f64).abs().log10().ceil() as u32
}
}
impl Roundable for u32 {
#[inline]
fn round_zeros(self, zeros: u32) -> u32 {
let power = 10_f64.powi(zeros as i32);
((self as f64 / power).round() * power) as u32
}
#[inline]
fn ceil_zeros(self, zeros: u32) -> u32 {
let power = 10_f64.powi(zeros as i32);
((self as f64 / power).ceil() * power) as u32
}
#[inline]
fn floor_zeros(self, zeros: u32) -> u32 {
let power = 10_f64.powi(zeros as i32);
((self as f64 / power).floor() * power) as u32
}
#[inline]
fn round_sf(self, sig_figs: u32) -> Self {
let digits: i32 = self.get_digits() as i32;
let power = 10_f64.powi(digits - sig_figs as i32);
((self as f64 / power).round() * power) as u32
}
#[inline]
fn ceil_sf(self, sig_figs: u32) -> Self {
let digits: i32 = self.get_digits() as i32;
let power = 10_f64.powi(digits - sig_figs as i32);
((self as f64 / power).ceil() * power) as u32
}
#[inline]
fn floor_sf(self, sig_figs: u32) -> Self {
let digits: i32 = self.get_digits() as i32;
let power = 10_f64.powi(digits - sig_figs as i32);
((self as f64 / power).floor() * power) as u32
}
#[doc(hidden)]
#[inline]
fn get_digits(&self) -> u32 {
(*self as f64).abs().log10().ceil() as u32
}
}
impl Roundable for u64 {
#[inline]
fn round_zeros(self, zeros: u32) -> u64 {
let power = 10_f64.powi(zeros as i32);
((self as f64 / power).round() * power) as u64
}
#[inline]
fn ceil_zeros(self, zeros: u32) -> u64 {
let power = 10_f64.powi(zeros as i32);
((self as f64 / power).ceil() * power) as u64
}
#[inline]
fn floor_zeros(self, zeros: u32) -> u64 {
let power = 10_f64.powi(zeros as i32);
((self as f64 / power).floor() * power) as u64
}
#[inline]
fn round_sf(self, sig_figs: u32) -> Self {
let digits: i32 = self.get_digits() as i32;
let power = 10_f64.powi(digits - sig_figs as i32);
((self as f64 / power).round() * power) as u64
}
#[inline]
fn ceil_sf(self, sig_figs: u32) -> Self {
let digits: i32 = self.get_digits() as i32;
let power = 10_f64.powi(digits - sig_figs as i32);
((self as f64 / power).ceil() * power) as u64
}
#[inline]
fn floor_sf(self, sig_figs: u32) -> Self {
let digits: i32 = self.get_digits() as i32;
let power = 10_f64.powi(digits - sig_figs as i32);
((self as f64 / power).floor() * power) as u64
}
#[doc(hidden)]
#[inline]
fn get_digits(&self) -> u32 {
(*self as f64).abs().log10().ceil() as u32
}
}
mod tests;