当前位置: 首页 > news >正文

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));
http://www.xdnf.cn/news/1024003.html

相关文章:

  • 《第二章-内功筑基》 C++修炼生涯笔记(基础篇)数据类型与运算符
  • 前端给一行文字不设置宽度 ,不拆分 ,又能让某几个字在视觉下方居中显示
  • LeetCode 2529.正整数和负整数的最大计数
  • Appium + Java 测试全流程
  • Spring boot 的 maven 打包过程
  • Fiori 初学记录----怎么调用后端系统odata 服务实现简单的CURD
  • 使用特征线法求解一阶线性齐次偏微分方程组
  • 多模态大语言模型arxiv论文略读(121)
  • html+css+js趣味小游戏~(附源码)
  • 数据库分库分表情况下数据统计的相关问题详解(面试问答)
  • C++面试(9)-----反转链表
  • 2025年渗透测试面试题总结-字节跳动[实习]安全研发员(题目+回答)
  • CoLMDriver:基于LLM的协同自动驾驶
  • LangChain面试内容整理-知识点10:文本嵌入模型(Embeddings)使用
  • 如何安装使用qmt脚本跟单聚宽策略
  • C++四大默认成员函数:构造、析构、拷贝构造与赋值重载
  • 利用pycharm搭建模型步骤
  • Sqoop进阶之路:解锁数据迁移新姿势
  • 2025.6.12 【校内 NOI 训练赛】记录(集训队互测选做)
  • 使用OceanBase的Oblogminer进行日志挖掘的实践
  • Mysql 函数concat、concat_ws和group_concat
  • MySQL的对表对整库备份脚本
  • Elasticsearch 常用命令(未完成)
  • python中的文件操作处理:文本文件的处理、二进制文件的处理
  • 心之眼 豪华中文 免安 离线运行版
  • 大模型记忆相关(MemoryOs)
  • kafka Tool (Offset Explorer)使用SASL Plaintext进行身份验证
  • cinematic-gaussians
  • 【RAG+读代码】学术文档解析工具Nougat
  • DeepSeek 引领前端开发变革:AI 助力学习与工作新路径