Flutter高精度小数处理插件vy_fixed_decimal的使用
Flutter高精度小数处理插件vy_fixed_decimal的使用
简介
vy_fixed_decimal
是一个用于管理固定小数位数和货币数字的工具库。它提供了 FixedDecimal
类来处理具有固定小数位数的数值,并支持特定的舍入策略。此外,Money
类基于 FixedDecimal
构建,可以管理货币相关的操作。
功能模块
该插件逻辑上分为三个部分:
- Decimal 扩展与实用工具
包含一些对Decimal
类的扩展,例如DecimalPoint
类、线性回归计算类等。 - FixedDecimal 类
主要用于金融计算,确保在不丢失精度的情况下处理小数位数。 - Money 类
基于FixedDecimal
提供货币相关的功能。
FixedDecimal 类详解
参数说明
FixedDecimal
的主要参数包括:
-
最小值与小数位数(Scale)
Scale 0
表示没有小数位(如 12)。Scale 1
表示一位小数(如 12.3)。Scale 2
表示两位小数(如 12.37)。- 负小数位数表示整数部分的单位(如
-1
表示十位,-2
表示百位)。 - 默认情况下,如果数字有有限精度,则使用其自身的精度;否则默认为
Scale 10
。
-
舍入方式(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
。 -
缩放策略(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
}
更多关于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
}