#decimal-number #numbers #soroban #point #smart-contracts #no-std #handler

soroban_decimal_numbers

为 no_std 应用程序设计的 Soroban 用小数数字处理器

6 个版本

0.1.5 2023年10月4日
0.1.4 2023年10月4日

#2810 in 魔法豆

每月 22 次下载

MIT 许可证

14KB
337

soroban_decimal_numbers

这是一个用于 Rust 中处理小数点数字的工具,适用于 no_std。它专为 Soroban 智能合约设计,但如需可在任何地方使用。

背后的动机是 Soroban 不支持小数点数字。

安装

cargo add soroban_decimal_numbers

使用方法

您可以将 测试文件 作为参考。以下是一些示例

use soroban_decimal_numbers::DecimalNumberWrapper;

fn main() {
  let a = DecimalNumberWrapper::new("34.56");
  let b = DecimalNumberWrapper::new("12.34");

  assert!(DecimalNumberWrapper::add(a, b).as_tuple() == (46, 900));
  assert!(DecimalNumberWrapper::sub(a, b).as_tuple() == (22, 220));
  assert!(DecimalNumberWrapper::mul(a, b).as_tuple() == (426, 470));
  assert!(DecimalNumberWrapper::div(a, b).as_tuple() == (2, 800));

  assert!(DecimalNumberWrapper::cmp(a, b) == 1);
  assert!(DecimalNumberWrapper::cmp(b, a) == 2);
  assert!(DecimalNumberWrapper::cmp(a, a) == 0);
}

约束条件

此工具处于开发初期。未来可能会有更多的发展。

它使用最多3位小数的小数数字。目前此值是硬编码的,但将来可能被参数化。请注意,如果您的计算超出此约束,您将失去精度。例如,如果您尝试计算 12.34/34.56,结果为 0.35706018518,您将得到 0.357 - 它只是截断结果,所以操作是 floor,而不是 round 或其他类似操作。

目前不支持负数。如果您执行会导致负数的减法操作(例如 3-5),结果将是 0

请在使用元组表示时小心。您需要提供所有带小数的数字。如果您想表示例如 1.2,您需要这样做:DecimalNumberWrapper::from((1, 200)),如果您这样做 DecimalNumberWrapper::from((1, 2)),您将得到 1.002。强烈推荐初始化数字的方法是使用字符串切片:DecimalNumberWrapper::from("1.2");

无运行时依赖