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);// 去除多余的0str = 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));