Dart实现URI-1098 Sequence IJ 4时最后三行输出错误如何修复
问题原因
你的问题核心是浮点数精度误差:十进制的0.2无法用二进制浮点数精确表示,每次循环累加0.2的操作会产生微小的精度误差,循环到第11次时,变量i的实际存储值并不是精确的2,因此i==2的判断条件不成立,走了else分支输出了带一位小数的2.0,和预期的整数格式不符。
修复方案
方案1:替换循环变量为整数,避免浮点累加误差
不要直接用浮点数作为循环变量,改用整数计数后再计算浮点值,从根源避免累加误差:
void main() { // 总共循环11次:0*0.2 ~ 10*0.2 刚好覆盖0到2的范围 for (int step = 0; step <= 10; step++) { double i = step * 0.2; double baseJ = 1 + step * 0.2; for (double j = baseJ; j <= baseJ + 2; j++) { if (i.abs() < 1e-9 || (i - 1).abs() < 1e-9 || (i - 2).abs() < 1e-9) { print('I=${i.toStringAsFixed(0)} J=${j.toStringAsFixed(0)}'); } else { print('I=${i.toStringAsFixed(1)} J=${j.toStringAsFixed(1)}'); } } } }
方案2:修改浮点数判断逻辑,增加精度阈值
如果不想改动循环结构,只需把原来的全等判断改为带精度容差的判断即可,避免微小误差导致判断失效:
把原来的判断条件if(i==0 || i==1 || i==2)
修改为if(i.abs() < 1e-9 || (i - 1).abs() < 1e-9 || (i - 2).abs() < 1e-9)
内容的提问来源于stack exchange,提问作者Mehedi Hasan
相关产品推荐
相关产品推荐

