Задача простая: нужно округлять числа до N знаков после запятой. Делаю это классическим способом (Rust):
static POW_VEC: &'static [f64] = &[
0.0,
10.0,
100.0,
1000.0,
10000.0,
100000.0,
1000000.0,
10000000.0,
100000000.0,
];
fn round(num: f64, precision: u8) -> f64 {
let multiplier = POW_VEC[precision as usize];
let tmp_value = (num * multiplier).round().abs() as u64;
((tmp_value as f64) / multiplier) * num.signum()
}
fn main() {
println!("{}", round(123.456789, 3)); // 123.457
}
Также нужно учитывать, что 0.001 вполне себе число, просто маленькое. И у него дробную часть округлять нельзя.
То есть мне нужен алгоритм, которые определит, что дробная часть незначительна относительно целой части.
Примеры (при условии что точность 3-и знака):
1000000.001 -> 1000000
1000000.4 -> 1000000
80.005 -> 80
123.015 -> 123
1.001 -> 1.001
0.001 -> 0.001
0.0005 -> 0.001
Уверен, что-то подобное уже существует, только хз в какую сторону гуглить.