在 Rust 中使用整数数学获取百分比

问题描述 投票:0回答:1

我必须计算一些百分比,但我必须避免在 Rust 中使用浮点数。

我有这个数据结构

let data = Vec<Identity, u64>

由此我可以将所有 u64 相加得到总成熟度,我们将其称为总成熟度

let total_maturity = data.iter().map(|(,b)| b).sum()

所以现在我对所有这些都完全成熟了。获得每个神经元的成熟百分比应该是相当简单的,但我如何表达这一点。

使用浮点数会很简单,与神经元相关的百分比向量结果将类似于 [0.3, 0.4, 0.1 ....]

我听说过使用整数数学,但我不确定它到底是如何工作的。

rust percentage
1个回答
0
投票

您只需将所有数字乘以 100,然后再进行除法即可。

let data: Vec<u64> = vec![3, 4, 1, 2];
let total_maturity: u64 = data.iter().sum();

let percentages: Vec<u64> = data
    .iter()
    .map(|b| b * 100 / total_maturity)
    .collect();

println!("{:?}", percentages);
// [30, 40, 10, 20]

如果需要更高的精度,可以乘以更大的数字。请记住,如果您需要显示小数点或对它们进行数学运算,则需要重新引入小数点。

let data: Vec<u64> = vec![3, 4, 1, 9992];
let total_maturity: u64 = data.iter().sum();
let percentages: Vec<u64> = data
    .iter()
    .map(|b| b * 10_000 / total_maturity)
    .collect();

let formatted: Vec<String> = percentages
    .iter()
    .map(|&p| {
        let whole = p / 100;
        let frac = p % 100;
        format!("{whole}.{frac:.02}%")
        // or you could convert them to floats
        // format!("{}", p as f32 / 100.0)
    })
    .collect();

println!("{:?}", formatted);
// ["0.3%", "0.4%", "0.1%", "99.92%"]

如果您想要更灵活的东西,可以使用 rust_decimal crate

© www.soinside.com 2019 - 2024. All rights reserved.