Flutter大分数显示插件big_fraction的使用

Flutter大分数显示插件big_fraction的使用

Fork of fraction包

这是一个用于分数计算的Dart/Flutter插件。这个分支使用BigInt来表示分数的分子和分母。

与原始分数包的区别

该插件使用BigInt而不是int来表示分数的分子和分母。在处理较大的分数时,特别是在Web环境中,精度问题是一个常见问题。使用BigInt可以解决这个问题,但会占用更多的内存。

分数操作

你可以使用以下构造函数之一来创建一个BigFraction实例:

默认构造函数

BigFraction(BigInt.one, BigInt.two); // 1/2
BigFraction(BigInt.from(3), BigInt.one); // 3

from构造函数

BigFraction.from(3, 5); // 3/5
BigFraction.from(3, 1); // 3

fromString构造函数

BigFraction.fromString("2/4"); // 2/4
BigFraction.fromString("-2/4"); // -2/4
BigFraction.fromString("2/-4"); // 抛出异常
BigFraction.fromString("-2"); // -2/1
BigFraction.fromString("/3"); // 错误

fromDouble构造函数

BigFraction.fromDouble(1.5); // 3/2
BigFraction.fromDouble(-8.5); // -17/2
BigFraction.fromDouble(math.pi); // 208341/66317
BigFraction.fromDouble(math.pi, precision: 1.0e-4); // 333/106

注意,常量pi不能被表示为分数,因为它是一个无理数。构造函数只考虑给定的小数位来生成分数。

扩展方法

你还可以通过调用数字或字符串上的toBigFraction()扩展方法来创建一个BigFraction对象:

5.toBigFraction(); // 5/1
1.5.toBigFraction(); // 3/2
"6/5".toBigFraction(); // 6/5

注意,BigFraction对象是不可变的,因此需要更改对象内部状态的方法将返回一个新的实例。例如,reduce()方法会将分数简化到最简形式,并返回一个新的实例:

final fraction = BigFraction.fromString("12/20"); // 12/20
final reduced = fraction.reduce(); // 3/5

Unicode符号转换

BigFraction字符串可以转换为Unicode符号(如果可能的话):

BigFraction.fromGlyph("¼"); // BigFraction(1, 4)
BigFraction(1, 2).toStringAsGlyph(); // "½"

基本算术运算

你可以通过算术运算符轻松地进行加、减、乘、除操作:

final f1 = BigFraction(5, 7);
final f2 = BigFraction(1, 5);

final sum = f1 + f2; // 5/7 + 1/5
final sub = f1 - f2; // 5/7 - 1/5
final mul = f1 * f2; // 5/7 * 1/5
final div = f1 / f2; // 5/7 / 1/5

常见操作

BigFraction类型具有广泛的API,包括常见的分数操作:

BigFraction(10, 2).toDouble();  // 5.0
BigFraction(10, 2).inverse();   // 2/10
BigFraction(1, 15).isWhole;     // false
BigFraction(2, 3).negate();     // -2/3
BigFraction(1, 15).isImproper;  // false
BigFraction(1, 15).isProper;    // true

// 通过索引访问分子和分母
final fraction = BigFraction(-7, 12);

print('${fraction[0]}'); // -7
print('${fraction[1]}'); // 12

任何其他索引值(除了0和1)都会抛出BigFractionException异常。两个分数相等当且仅当它们的交叉乘积相等。例如,1/23/6被认为是等价的,因为1*6 = 3*2(实际上3/6等于1/2)。

混合分数操作

混合分数由整数部分和真分数(分子小于等于分母的分数)组成。构建一个MixedBigFraction对象非常简单:

MixedBigFraction(
  whole: 3, 
  numerator: 4, 
  denominator: 7
);

与普通分数一样,你也可以使用各种命名构造函数:

MixedBigFraction.fromDouble(1.5);
MixedBigFraction.fromString("1 1/2");

还可以使用扩展方法初始化MixedBigFraction

final mixed = "1 1/2".toMixedBigFraction();

注意,MixedBigFraction对象也是不可变的,就像BigFraction对象一样,因此保证实例的内部状态不会改变。确保查阅官方文档以获得完整的API概述。

埃及分数

埃及分数是一组不同的分数之和,其中分子始终为1,分母是正数,所有分母互不相同。例如:

5/8 = 1/2 + 1/8 (其中"1/2 + 1/8"是埃及分数)

换句话说,埃及分数是由形式为1/x的分数组成的和,这些分数表示一个真分数或假分数。以下是它们的计算方法:

final egyptianBigFraction1 = BigFraction(5, 8).toEgyptianBigFraction();
print("$egyptianBigFraction1"); // 输出 "1/2 + 1/8"

final egyptianBigFraction2 = MixedBigFraction(2, 4, 5).toEgyptianBigFraction();
print("$egyptianBigFraction2"); // 输出 "1 + 1 + 1/2 + 1/4 + 1/20"

compute()方法返回一个可迭代对象。

注意事项

BigFractionMixedBigFraction都继承自BigRational类型,这允许使用单个方法调用来解析这两种类型的分数:

// 这是一个 'BigFraction' 对象
Rational.tryParse('1/5'); // 1/5

// 这是一个 'MixedBigFraction' 对象
Rational.tryParse('2 4/7'); // 2 4/7

// 这是 'null' 因为字符串不表示分数或混合分数
Rational.tryParse(''); // null

更多关于Flutter大分数显示插件big_fraction的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter大分数显示插件big_fraction的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


big_fraction 是一个用于处理大分数(分数形式的大数)的 Flutter 插件。它允许你在 Flutter 应用中以分数的形式表示和操作大数,适用于需要高精度计算的场景。

以下是使用 big_fraction 插件的基本步骤和示例:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  big_fraction: ^1.0.0  # 请检查最新版本

然后运行 flutter pub get 来获取依赖。

2. 导入包

在你的 Dart 文件中导入 big_fraction 包:

import 'package:big_fraction/big_fraction.dart';

3. 创建大分数

你可以使用 BigFraction 类来创建大分数。BigFraction 支持多种构造函数:

  • BigFraction.fromInt(numerator, denominator):从分子和分母创建分数。
  • BigFraction.fromDouble(value):从浮点数创建分数。
  • BigFraction.fromString(str):从字符串创建分数。

示例:

// 从分子和分母创建分数
BigFraction fraction1 = BigFraction.fromInt(3, 4);

// 从浮点数创建分数
BigFraction fraction2 = BigFraction.fromDouble(0.75);

// 从字符串创建分数
BigFraction fraction3 = BigFraction.fromString('3/4');

4. 操作大分数

big_fraction 提供了一系列方法来操作分数,例如加法、减法、乘法、除法等。

示例:

BigFraction a = BigFraction.fromInt(3, 4);
BigFraction b = BigFraction.fromInt(1, 2);

// 加法
BigFraction sum = a + b;

// 减法
BigFraction difference = a - b;

// 乘法
BigFraction product = a * b;

// 除法
BigFraction quotient = a / b;

print('Sum: $sum'); // 输出: Sum: 5/4
print('Difference: $difference'); // 输出: Difference: 1/4
print('Product: $product'); // 输出: Product: 3/8
print('Quotient: $quotient'); // 输出: Quotient: 3/2

5. 格式化输出

你可以将 BigFraction 对象转换为字符串或其他格式:

BigFraction fraction = BigFraction.fromInt(3, 4);

// 转换为字符串
String str = fraction.toString(); // 输出: 3/4

// 转换为浮点数
double value = fraction.toDouble(); // 输出: 0.75

// 转换为百分数
String percentage = fraction.toPercentageString(); // 输出: 75%

6. 其他功能

big_fraction 还提供了其他一些功能,例如简化分数、比较分数、检查分数是否为整数等。

示例:

BigFraction fraction = BigFraction.fromInt(6, 8);

// 简化分数
BigFraction simplified = fraction.reduce(); // 输出: 3/4

// 检查分数是否为整数
bool isInteger = fraction.isInteger; // 输出: false

// 比较分数
BigFraction other = BigFraction.fromInt(3, 4);
bool isEqual = fraction == other; // 输出: false

7. 完整示例

以下是一个完整的 Flutter 示例,展示了如何使用 big_fraction 插件:

import 'package:flutter/material.dart';
import 'package:big_fraction/big_fraction.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('BigFraction Example')),
        body: Center(
          child: FractionExample(),
        ),
      ),
    );
  }
}

class FractionExample extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    BigFraction a = BigFraction.fromInt(3, 4);
    BigFraction b = BigFraction.fromInt(1, 2);

    BigFraction sum = a + b;
    BigFraction product = a * b;

    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text('Fraction A: $a'),
        Text('Fraction B: $b'),
        Text('Sum: $sum'),
        Text('Product: $product'),
      ],
    );
  }
}
回到顶部