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

Angular由一个bug说起之八:实践中遇到的一个数据颗粒度的问题

互联网产品离不开数据处理,数据处理有一些基本的原则包括:准确性、‌完整性、一致性、保密性、及时性

  • 准确性是数据处理的首要目标,确保数据的真实性和可靠性。准确的数据是进行分析和决策的基础,因此,在数据处理过程中应采取措施确保数据的准确性,如建立数据验证机制,检查数据输入错误等。
  • 完整性指的是数据应当涵盖所有相关变量和维度,没有遗漏或缺失。如果数据不完整,可能会导致分析时的偏差和误差,因此应采取措施确保数据的完整性,如使用数据清洗工具清理数据,填补缺失值等。
  • 一致性意味着数据在不同的时间和地点应保持一致。数据的一致性对于确保分析结果的可靠性至关重要,应采取措施如使用统一的数据格式和命名规范,进行数据标准化等。
  • 保密性要求数据应根据相关法律法规和隐私政策进行保护。在处理敏感的个人信息或商业机密时,应采取措施保护数据,如限制数据访问权限,加密敏感数据等。
  • 及时性强调数据应在需要时及时提供和更新。过时的数据无法支持及时的决策和分析,因此应确保数据的及时性,如建立定时更新的数据采集和处理流程,‌及时反馈数据结果等。

我在最近的项目中就遇到了一个关于 准确性 完整性 的问题。

具体是这样:我们项目中有使用各种 Chart 来展示数据的功能,这些数据根据不同的类型和单位会为其加上前缀、后缀或者省略小数。比如:type = percent 数据后加 %type = integer 数据不能有小数位,type = currency 数据前加 $ 等等。

问题出在 percent类型 的数据,有些数据如果按百分比来计算通常不会大于 1%,比如彩票中一等奖的概率。这个时候如果要比较两个数据选出具有更优表现的数据,小数点就需要多保留一到两位。

举个例子,假如百分比保留1位小数。同样是省略后 0.1% 的两个数据,一个 0.01% 另一个 0.04%,两者的差距可能是很大的。

如下图,虽然数据很小但是表现在 Chart 上差距是很明显

我们目前的解决方案是判断数据如果 0.0% < X < 0.1% 就保留两位小数,其余情况保留一位小数。

function formatPercentRounding(data) {const value = data, result = '0.0%';// 0.0% < X < 0.1%const decimalDigits = (value > 0 && value * 1000 < 1) ? 2 : 1;if (value) {result = (Math.round(value * 1000)/10).toFixed(decimalDigits) + '%';}return result;
}

之所以使用这种比较直接的方式是因为项目中的数据类型已经确定,而且对数字的处理逻辑没有统一在一个文件中。这是大型项目经常遇到的问题,起到相同作用的代码因为一些小的差别而分别写在管理各自功能的文件里。

如果项目重构这些都是需要优化的地方。针对这篇文章提到的数字缩写的问题,可以有两种处理方案。

一种是维护一个 config.json,如:

[{chart: 'bar',numberRules: [{type: 'integer',decimalDigits: 0},{type: 'percent',decimalDigits: 2,suffix: '%'}]},{chart: 'grid',numberRules: [{type: 'currency',decimalDigits: 1,prefix: '$'},{type: 'percent',decimalDigits: 3,suffix: '%'}]},...
]

或者将代码放在一个统一的方法中处理:

const method = (chartType, data) => {let decimalDigits = 1;switch (chartType) {case 'grid':decimalDigits = 2;...break;...default:break;}return data.toFixed(decimalDigits);
}

两种方法都能解决问题,但是推荐第一种。我们可以直接把 config 文件存入数据库,这样我们就可以统一维护一个表,不管是前端来处理数据还是后端来处理都能遵守相同的规则。

以上就是我在实践中遇到的关于数据颗粒度的一个小问题以及对它的思考,谢谢

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Python机器学习实战:分类算法K近邻
  • Neuron协议网关的北向应用插件开发
  • mysql之视图的创建以及查询;
  • uboot的mmc partconf命令
  • 谷粒商城实战笔记-56~57-商品服务-API-三级分类-修改-拖拽功能完成
  • 前端Vue项目中腾讯地图SDK集成:经纬度与地址信息解析的实践
  • GD32 MCU电源复位和系统复位有什么区别
  • FastGPT 源码调试配置
  • mesa LLVMpipe ORCJIT 上游化:一场历时两年的后端合并马拉松,幕后英雄竟是 TA!
  • 基于 HTML+ECharts 实现监控平台数据可视化大屏(含源码)
  • 使用 @Audited 增强Spring Boot 应用程序的数据审计能力
  • vue3.2使用@wangeditor/editor-for-vue实现富文本编辑器,后端使用thinkphp上传图片
  • 父子组件的传参问题,一方改变,另一方随之改变
  • JQuery+HTML+JavaScript:实现地图位置选取和地址模糊查询
  • 图片上传成功却无法显示:静态资源路径配置问题解析
  • 自己简单写的 事件订阅机制
  • Angular Elements 及其运作原理
  • C语言笔记(第一章:C语言编程)
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • leetcode46 Permutation 排列组合
  • Linux Process Manage
  • PHP面试之三:MySQL数据库
  • Python中eval与exec的使用及区别
  • 对超线程几个不同角度的解释
  • 高程读书笔记 第六章 面向对象程序设计
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 软件开发学习的5大技巧,你知道吗?
  • 使用parted解决大于2T的磁盘分区
  • 小程序测试方案初探
  • ionic异常记录
  • Linux权限管理(week1_day5)--技术流ken
  • 数据可视化之下发图实践
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #QT(一种朴素的计算器实现方法)
  • (8)STL算法之替换
  • (Python) SOAP Web Service (HTTP POST)
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (二)测试工具
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (七)glDrawArry绘制
  • (一)十分简易快速 自己训练样本 opencv级联haar分类器 车牌识别
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • .dwp和.webpart的区别
  • .net 按比例显示图片的缩略图
  • .NET 表达式计算:Expression Evaluator
  • .NET/C# 使窗口永不获得焦点
  • .NetCore+vue3上传图片 Multipart body length limit 16384 exceeded.
  • .net反混淆脱壳工具de4dot的使用
  • .net知识和学习方法系列(二十一)CLR-枚举
  • .net中我喜欢的两种验证码
  • @EnableAsync和@Async开始异步任务支持
  • [ACTF2020 新生赛]Upload 1
  • [AHOI2009]中国象棋 DP,递推,组合数
  • [BZOJ 4598][Sdoi2016]模式字符串