use rust_decimal::prelude::*;
pub fn calculate_percentage_f32(numerator: u64, denominator: u64) -> f32 {
if denominator == 0 {
return 0.0;
}
let num_decimal = Decimal::from(numerator);
let den_decimal = Decimal::from(denominator);
let hundred = Decimal::from(100);
let result = (num_decimal / den_decimal) * hundred;
result.to_f32().unwrap_or(0.0)
}
pub fn millis_to_f64_for_stats(millis: u128) -> f64 {
Decimal::from_u128(millis)
.and_then(|d| d.to_f64())
.unwrap_or(f64::MAX)
}
pub fn u64_to_f64_for_stats(value: u64) -> f64 {
Decimal::from(value).to_f64().unwrap_or(0.0)
}
#[cfg(test)]
mod tests {
use super::*;
use approx::assert_relative_eq;
#[test]
fn test_calculate_percentage_f32() {
assert_relative_eq!(calculate_percentage_f32(1, 4), 25.0, epsilon = 0.0001);
assert_relative_eq!(calculate_percentage_f32(0, 100), 0.0, epsilon = 0.0001);
assert_relative_eq!(calculate_percentage_f32(100, 0), 0.0, epsilon = 0.0001); }
#[test]
fn test_millis_to_f64_for_stats() {
assert_relative_eq!(millis_to_f64_for_stats(1000), 1000.0, epsilon = 0.0001);
let large_value = u128::MAX;
let result = millis_to_f64_for_stats(large_value);
assert!(result.is_finite());
}
#[test]
fn test_u64_to_f64_for_stats() {
assert_relative_eq!(u64_to_f64_for_stats(42), 42.0, epsilon = 0.0001);
let large_value = u64::MAX;
let result = u64_to_f64_for_stats(large_value);
assert!(result.is_finite());
}
}