如何优化正负数字比较逻辑,避免重复判断以简化toFixed处理?
重构方案
核心思路是利用绝对值统一处理正负数字的范围判断,避免重复编写正负两侧的条件,同时可通过配置化规则让代码更简洁、易维护。
方案一:简化条件判断(基础版)
先取数字的绝对值,仅针对绝对值做范围判断,确定小数位数后直接对原数字调用toFixed(该方法会自动保留符号):
const absValue = Math.abs(numberValue); let fixedDigits; if (absValue > 100 && absValue < 999) { fixedDigits = 0; } else if (absValue > 10 && absValue < 99) { fixedDigits = 1; } else if (absValue > 1 && absValue < 9) { fixedDigits = 2; } else if (absValue > 0 && absValue < 1) { fixedDigits = 3; } else if (absValue >= 1000) { fixedDigits = 4; } // 注意:原代码未覆盖边界值(如100、10、1、0、-1000等),需根据业务需求补充处理逻辑 scalarNotation = numberValue.toFixed(fixedDigits);
方案二:配置化规则列表(推荐,易扩展)
把范围判断规则和对应小数位数封装成数组,循环匹配对应规则,后续修改或新增规则只需调整数组,无需改动判断逻辑:
// 定义格式化规则,顺序需与原判断逻辑一致 const formatRules = [ { match: (absVal) => absVal > 100 && absVal < 999, digits: 0 }, { match: (absVal) => absVal > 10 && absVal < 99, digits: 1 }, { match: (absVal) => absVal > 1 && absVal < 9, digits: 2 }, { match: (absVal) => absVal > 0 && absVal < 1, digits: 3 }, { match: (absVal) => absVal >= 1000, digits: 4 }, ]; const absValue = Math.abs(numberValue); // 找到匹配的规则 const matchedRule = formatRules.find(rule => rule.match(absValue)); // 处理未匹配的边界值,这里默认设为0位,可根据需求调整 const fixedDigits = matchedRule ? matchedRule.digits : 0; scalarNotation = numberValue.toFixed(fixedDigits);
补充说明
原代码未覆盖numberValue等于边界值(如100、-100、10、-10、1、-1、0、1000、-1000)的场景,需根据实际业务需求调整规则中的判断条件(例如把>改为>=,或新增规则处理边界值)。
内容的提问来源于stack exchange,提问作者ksusha-beep
相关产品推荐
相关产品推荐

