21 个版本 (12 个破坏性更新)
0.13.2 | 2024 年 6 月 1 日 |
---|---|
0.12.0 | 2024 年 1 月 26 日 |
0.11.0 | 2023 年 2 月 18 日 |
0.8.0 | 2022 年 12 月 31 日 |
0.5.3 | 2022 年 3 月 18 日 |
#930 在 游戏
每月下载量 1,274
89KB
2K SLoC
tf2-price
用于 Team Fortress 2 物品定价的实用工具。轻量级,仅有一个必需的依赖项。
由于浮点数固有的不精确性,分数货币在算术中会面临挑战。一种解决方案是以货币的最小单位(例如,美国货币的“分”)或 Team Fortress 2 中的武器作为存储整数。这允许精确计算,而无需进行繁琐的转换,确保结果可预测。
金属价值以武器存储。例如,1.33 纯化存储为 24 把武器。与废料相比,我们能够表达更精确的值(购买和销售 MvM 部件通常需要武器的精确值)。低于一把武器的值在实践中几乎从不使用,除非使用 FloatCurrencies
。
使用 Serde 进行安装
tf2-price = { version = "0.13.2", features = ["serde"] }
用法
基本用法
use tf2_price::{Currencies, metal, ONE_REF, ONE_REC};
let currencies = Currencies {
keys: 5,
weapons: metal!(1.33), // 24 weapons.
};
// 1.33 refined or 24 weapons.
assert_eq!(currencies.weapons, 24);
assert_eq!(currencies.weapons, ONE_REF + ONE_REC);
assert_eq!(currencies.weapons, metal!(1.33));
// String conversions.
assert_eq!(
format!("Selling for {currencies}."),
"Selling for 5 keys, 1.33 ref.",
);
assert_eq!(
"5 keys, 1.33 ref".parse::<Currencies>().unwrap(),
currencies,
);
// Key price stored as weapons.
let key_price_weapons = metal!(50);
// Conversion to a single total.
let total = currencies.to_weapons(key_price_weapons);
// 5 (keys) * 50 (key price) * 18 (one ref) = 4500
// 4500 + 24 (weapons) = 4524
assert_eq!(total, 4524);
assert_eq!(
// Convert total back into keys + weapons.
Currencies::from_weapons(total, key_price_weapons),
currencies,
);
算术
use tf2_price::{Currencies, Currency};
let golden_pan = Currencies {
keys: 3000,
weapons: 0,
};
assert_eq!(
// Multiply by an integer.
golden_pan * 2,
Currencies {
keys: 6000,
weapons: 0,
},
);
assert_eq!(
// Multiply by a floating point number.
golden_pan * 2.5,
Currencies {
keys: 7500,
weapons: 0,
},
);
assert_eq!(
// Add another currencies.
golden_pan + Currencies {
keys: 0,
weapons: 2,
},
Currencies {
keys: 3000,
weapons: 2,
},
);
在 Rust 的发布构建中,整数可能会出现溢出风险。虽然这种行为 不被认为是危险的,但它是有问题的。这个软件包使用 饱和算术 进行整数算术,并提供了检查溢出的方法(例如使用 checked_from_weapons
)。任何可能失败的方法都将检查溢出。
由于 64 位整数的大小很大(最大值 9,223,372,036,854,775,807),因此担心达到其界限通常是多余的。
浮点数精度
要存储来自响应的浮点数,请使用 FloatCurrencies
作为容器。但是,建议不要用于计算或比较。这个软件包提供将浮点数转换为整数(基于使用情况)的实用工具(饱和,检查)。
use tf2_price::{Currencies, FloatCurrencies, Currency};
// To preserve original values, use FloatCurrencies.
let float_currencies = FloatCurrencies {
keys: 1.0,
// Unlike Currencies, metal is not counted in weapons.
// 1.33 means 1.33 refined.
metal: 1.33,
};
// Converting to Currencies (checks for safe conversion).
let currencies = Currencies::try_from(float_currencies).unwrap();
assert_eq!(
currencies,
Currencies {
keys: 1,
metal: 24,
},
);
// Fails if the key value holds a fractional number.
assert!(Currencies::try_from(FloatCurrencies {
keys: 1.5,
metal: 0.0,
}).is_err());
// Fails if a value is outside of integer bounds.
assert!(Currencies::try_from(FloatCurrencies {
keys: Currency::MAX as f32 * 2.0,
metal: 0.0,
}).is_err());
序列化
use tf2_price::{Currencies, metal};
let json = r#"{"keys":5,"metal":2.33}"#;
let currencies: Currencies = serde_json::from_str(json).unwrap();
assert_eq!(
currencies,
Currencies {
keys: 5,
weapons: metal!(2.33),
},
);
assert_eq!(
json,
serde_json::to_string(¤cies).unwrap(),
);
许可证
依赖项
~195KB