Flutter:加减乘除,科学计数法转换

方法封装

import 'dart:math';

class MathUtils {
  /// 检测小数点精度
  static int countDecimals(dynamic num) {
    try {
      String str = num.toString();
      if (str.contains('.')) {
        return str.split('.')[1].length;
      }
    } catch (e) {}
    return 0;
  }

  /// 将科学计数法转换为普通数字
  static String scientific2No(dynamic val) {
    String str = val.toString();
    if (RegExp(r'\d+\.?\d*e[+-]*\d+', caseSensitive: false).hasMatch(str)) {
      double d = double.parse(str);
      str = d.toStringAsFixed(20);
      // 去除多余的0
      str = str.replaceFirst(RegExp(r'([0-9]+\.[0-9]*[1-9])0+'), r'$1');
      str = str.replaceFirst(RegExp(r'\.0+'), '');
      str = str.replaceAll('', '').replaceAll('', '');
      // 防止出现科学计数法
      if (str.contains('e') || str.contains('E')) {
        // 兜底
        return d.toString();
      }
      return str;
    }
    return str;
  }

  /// 截取小数点后n位(不四舍五入,直接截断)
  static String omitTo(dynamic val, int scale) {
    String value = scientific2No(val);
    if (!value.contains('.')) {
      return value + '.' + '0' * scale;
    }
    List<String> parts = value.split('.');
    String entity = parts[0];
    String precisionVal = parts[1];
    if (precisionVal.length > scale) {
      // 截断多余小数位
      precisionVal = precisionVal.substring(0, scale);
    } else if (precisionVal.length < scale) {
      // 补零
      precisionVal = precisionVal.padRight(scale, '0');
    }
    return entity + '.' + precisionVal;
  }

  /// 计算两个数的和
  static String add(dynamic num1, dynamic num2, [int? scale]) {
    num1 = scientific2No(num1);
    num2 = scientific2No(num2);
    int precision1 = countDecimals(num1);
    int precision2 = countDecimals(num2);
    int amplification = pow(10, max(precision1, precision2)).toInt();
    double val = (double.parse(num1) * amplification + double.parse(num2) * amplification) / amplification;
    String result = scientific2No(val);
    if (scale != null) result = omitTo(result, scale);
    return result;
  }

  /// 计算两个数的差值
  static String subtr(dynamic num1, dynamic num2, [int? scale]) {
    num1 = scientific2No(num1);
    num2 = scientific2No(num2);
    int precision1 = countDecimals(num1);
    int precision2 = countDecimals(num2);
    int precision = max(precision1, precision2);
    int amplification = pow(10, precision).toInt();
    double val = ((double.parse(num1) * amplification - double.parse(num2) * amplification) / amplification);
    String result = scientific2No(val);
    if (scale != null) result = omitTo(result, scale);
    return result;
  }

  /// 计算两个数的乘积
  static String multiple(dynamic num1, dynamic num2, [int? scale]) {
    num1 = scientific2No(num1);
    num2 = scientific2No(num2);
    int precision = 0;
    precision += countDecimals(num1);
    precision += countDecimals(num2);
    double val = (double.parse(num1.toString().replaceAll('.', '')) * double.parse(num2.toString().replaceAll('.', ''))) / pow(10, precision);
    String result = scientific2No(val);
    if (scale != null) result = omitTo(result, scale);
    return result;
  }

  /// 两个数相除
  static String division(dynamic num1, dynamic num2, [int? scale]) {
    num1 = scientific2No(num1);
    num2 = scientific2No(num2);
    int precision1 = countDecimals(num1);
    int precision2 = countDecimals(num2);
    int m = precision1 > precision2 ? precision1 : precision2;
    if (m <= 1) m = 1;
    double val = double.parse(multiple(num1, m)) / double.parse(multiple(num2, m));
    String result = scientific2No(val);
    if (scale != null) result = omitTo(result, scale);
    return result;
  }
} 

使用示例:

// 保留4位小数
MathUtils.omitTo(1.0012345678, 4)

// 乘法:num1,num2,保留小数位
total = double.parse(MathUtils.multiple(1.5,20.2, 2));

你可能感兴趣的:(Flutter:功能,flutter)