Flutter高精度小数处理插件vy_fixed_decimal的使用

Flutter高精度小数处理插件vy_fixed_decimal的使用

简介

vy_fixed_decimal 是一个用于管理固定小数位数和货币数字的工具库。它提供了 FixedDecimal 类来处理具有固定小数位数的数值,并支持特定的舍入策略。此外,Money 类基于 FixedDecimal 构建,可以管理货币相关的操作。

功能模块

该插件逻辑上分为三个部分:

  1. Decimal 扩展与实用工具
    包含一些对 Decimal 类的扩展,例如 DecimalPoint 类、线性回归计算类等。
  2. FixedDecimal 类
    主要用于金融计算,确保在不丢失精度的情况下处理小数位数。
  3. Money 类
    基于 FixedDecimal 提供货币相关的功能。

FixedDecimal 类详解

参数说明

FixedDecimal 的主要参数包括:

  1. 最小值与小数位数(Scale)

    • Scale 0 表示没有小数位(如 12)。
    • Scale 1 表示一位小数(如 12.3)。
    • Scale 2 表示两位小数(如 12.37)。
    • 负小数位数表示整数部分的单位(如 -1 表示十位,-2 表示百位)。
    • 默认情况下,如果数字有有限精度,则使用其自身的精度;否则默认为 Scale 10
  2. 舍入方式(Rounding) 支持以下十种舍入方式:

    • 截断(Truncate)
    • 向下取整(Floor)
    • 向上取整(Ceil)
    • 远离零(Away From Zero)
    • 半进位(Half Up)
    • 半退位(Half Down)
    • 半向零(Half Towards Zero)
    • 半远离零(Half Away From Zero)
    • 半偶数(Half To Even)
    • 半奇数(Half To Odd)

    默认舍入方式为 Half To Even

  3. 缩放策略(Scaling Policy) 缩放策略决定了如何处理不同操作数的精度差异。支持四种策略:

    • Adjust:尝试保持最小的小数位数,同时尽量减少精度损失。
    • Same As First:结果的精度与第一个操作数相同。
    • Bigger Scale:结果采用较大的精度。
    • This Or Nothing:仅当结果能够满足第一个操作数的精度时才进行缩放。

使用示例

以下是一个完整的示例,展示如何使用 vy_fixed_decimal 插件进行高精度小数运算。

import 'package:decimal/decimal.dart';
import 'package:vy_fixed_decimal/src/fixed_decimal.dart';

void main() {
  // 创建两个 FixedDecimal 实例
  FixedDecimal fixed = FixedDecimal.fromInt(5);
  FixedDecimal second = FixedDecimal.fromInt(3);

  // 简单加法运算
  FixedDecimal result = fixed + FixedDecimal.fromInt(1);
  print(result); // 输出: 6

  // 加法运算,其中一个操作数为 int
  result = fixed + 1;
  print(result); // 输出: 6

  // 使用 add 方法进行加法运算,指定小数位数
  result = fixed.add(double.parse('2.3'), scale: 1);
  print(result); // 输出: 7.3

  // 静态方法进行加法运算
  result = FixedDecimal.addition(fixed, double.parse('2.3'), scale: 1);
  print(result); // 输出: 7.3

  // 混合运算,支持 double 和 int
  result = FixedDecimal.addition(double.parse('2.3'), 5, scale: 1);
  print(result); // 输出: 7.3

  // 高精度加法运算示例
  print((FixedDecimal.parse(
              '31878018903828899277492024491376690701584023926880.0') +
          Decimal.parse('0.9'))
      .toString());
  // 输出: 31878018903828899277492024491376690701584023926881

  print((FixedDecimal.parse(
              '31878018903828899277492024491376690701584023926880.0',
              scale: 1) +
          Decimal.parse('0.9'))
      .toString());
  // 输出: 31878018903828899277492024491376690701584023926880.9

  // 静态方法进行高精度加法运算
  print(FixedDecimal.addition(
          Decimal.parse('0.9'),
          FixedDecimal.parse(
              '31878018903828899277492024491376690701584023926880.0'))
      .toString());
  // 输出: 31878018903828899277492024491376690701584023926881

  // 减法运算
  result = second - fixed;
  print(result); // 输出: -2
}
1 回复

更多关于Flutter高精度小数处理插件vy_fixed_decimal的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


vy_fixed_decimal 是一个用于 Flutter 的高精度小数处理插件,特别适用于需要高精度计算的场景,如金融、科学计算等。它提供了对固定小数位数的支持,避免了浮点数计算中的精度丢失问题。

安装

首先,你需要在 pubspec.yaml 文件中添加 vy_fixed_decimal 依赖:

dependencies:
  vy_fixed_decimal: ^1.0.0

然后运行 flutter pub get 来安装依赖。

基本用法

1. 创建 FixedDecimal 对象

你可以通过多种方式创建 FixedDecimal 对象:

import 'package:vy_fixed_decimal/vy_fixed_decimal.dart';

void main() {
  // 从整数创建
  FixedDecimal decimal1 = FixedDecimal.fromInt(1234, scale: 2); // 12.34

  // 从字符串创建
  FixedDecimal decimal2 = FixedDecimal.parse("56.78", scale: 2); // 56.78

  // 从 double 创建
  FixedDecimal decimal3 = FixedDecimal.fromDouble(90.12, scale: 2); // 90.12
}

2. 基本运算

FixedDecimal 支持基本的算术运算,如加、减、乘、除:

void main() {
  FixedDecimal a = FixedDecimal.parse("10.50", scale: 2);
  FixedDecimal b = FixedDecimal.parse("20.25", scale: 2);

  // 加法
  FixedDecimal sum = a + b; // 30.75

  // 减法
  FixedDecimal difference = b - a; // 9.75

  // 乘法
  FixedDecimal product = a * b; // 212.6250

  // 除法
  FixedDecimal quotient = b / a; // 1.9286
}

3. 比较操作

FixedDecimal 也支持比较操作:

void main() {
  FixedDecimal a = FixedDecimal.parse("10.50", scale: 2);
  FixedDecimal b = FixedDecimal.parse("20.25", scale: 2);

  // 比较
  bool isEqual = a == b; // false
  bool isGreater = a > b; // false
  bool isLess = a < b; // true
}

4. 格式化输出

你可以将 FixedDecimal 对象转换为字符串或 double:

void main() {
  FixedDecimal decimal = FixedDecimal.parse("123.456", scale: 3);

  // 转换为字符串
  String str = decimal.toString(); // "123.456"

  // 转换为 double
  double dbl = decimal.toDouble(); // 123.456
}

高级用法

1. 自定义精度

你可以通过 scale 参数来指定小数的精度:

void main() {
  FixedDecimal decimal = FixedDecimal.parse("123.456789", scale: 4); // 123.4567
}

2. 四舍五入

你可以使用 round 方法对小数进行四舍五入:

void main() {
  FixedDecimal decimal = FixedDecimal.parse("123.456789", scale: 4);
  FixedDecimal rounded = decimal.round(scale: 2); // 123.46
}

3. 其他数学操作

FixedDecimal 还支持其他数学操作,如取绝对值、取反等:

void main() {
  FixedDecimal decimal = FixedDecimal.parse("-123.456", scale: 3);

  // 取绝对值
  FixedDecimal absValue = decimal.abs(); // 123.456

  // 取反
  FixedDecimal negated = -decimal; // 123.456
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!