Flutter中如何仅对百万位进行数值取整?
取整规则实现优化
规则回顾
- 当数值的百万位余数≥500,000时,向上取整至最近的百万整数
- 当数值的百万位余数<500,000时,向下取整至最近的百万整数
示例: - 4,843,820,000 → 余数820,000≥500,000 → 4,844,000,000
- 1,136,362,500 → 余数362,500<500,000 → 1,136,000,000
- 1,500,000 → 余数500,000≥500,000 → 2,000,000
- 1,450,000 → 余数450,000<500,000 → 1,000,000
原代码问题分析
原代码存在以下问题:
- 区间判断有遗漏(如等于99999、999999等边界值未覆盖)
- 依赖
round()的四舍五入逻辑,虽部分情况符合需求,但不如直接按规则实现直观可靠 - 多分支重复操作,代码冗余
优化后的实现代码
String kmbGenerator(int number) { const int unit = 1000000; // 计算商和余数 int quotient = number ~/ unit; int remainder = number % unit; // 按规则判断是否进位 if (remainder >= 500000) { quotient += 1; } // 处理小于百万的情况 if (quotient == 0) { return "0"; } // 生成带千位分隔符的结果 String result = "${quotient * unit}"; return result.replaceAllMapped(RegExp(r'(\d{1,3})(?=(\d{3})+(?!\d))'), (match) => "${match[1]},"); }
代码说明
- 统一单位处理:以1,000,000为固定单位,通过商和余数判断进位,避免多分支冗余
- 明确进位逻辑:直接判断余数是否≥500,000,完全贴合需求规则,无歧义
- 边界全覆盖:处理了所有整数场景,包括小于百万、刚好等于百万、余数等于500000等边界情况
- 自动格式化:用正则表达式自动添加千位分隔符,无需手动拼接字符串
测试验证
- 输入
4843820000→ 输出"4,844,000,000" - 输入
1136362500→ 输出"1,136,000,000" - 输入
1500000→ 输出"2,000,000" - 输入
1450000→ 输出"1,000,000" - 输入
499999→ 输出"0" - 输入
500000→ 输出"1,000,000"
内容的提问来源于stack exchange,提问作者Carl French
相关产品推荐
相关产品推荐

