use crate::{
design::prelude::*,
traits::{NumCast, NumFromPrimitive},
};
const fn has_fractional_part(value: f64) -> bool {
value.is_finite() && value.to_bits() != value.trunc().to_bits()
}
pub(crate) fn try_cast_decimal<N: NumCast + Clone>(value: &N) -> Option<Decimal> {
if let Some(float) = value.to_f64()
&& has_fractional_part(float)
{
return Decimal::from_f64_lossy(float);
}
value
.to_i64()
.and_then(Decimal::from_i64)
.or_else(|| value.to_u64().and_then(Decimal::from_u64))
.or_else(|| value.to_f64().and_then(Decimal::from_f64_lossy))
}