Raku中列表的列表求和异常原因及扁平化元素高效转float方法
两段求和代码结果不一致的原因
确实是浮点数精度问题导致的:
- Raku中
1e50属于双精度浮点数(Num类型),双精度浮点数仅能精确表示-2^53 ~ 2^53范围内的整数,1e50远超出这个范围,因此1e50 + 1的计算结果在双精度下会直接等于1e50,再加上-1e50就得到0,每组三个数的求和结果都是0,1000组累加后自然总结果为0。 - 而
[1, 2] xx 5的元素都是Raku默认的任意精度Int类型,不会存在精度损失,求和时可以得到正确结果。
高效转换列表元素为Num类型的方法
你目前使用的遍历转换方法是可行的,还有两种更简洁、性能同等甚至更优的实现方式:
- 直接在扁平化后使用map批量转换:
my @array = $arr.flat.map(*.Num);
- 声明数组元素类型为Num,由编译器自动完成类型转换:
my Num @array = $arr.flat;
Raku的Num类型就是标准双精度浮点数,对应你提到的float类型需求。
内容的提问来源于stack exchange,提问作者Suman
相关产品推荐
相关产品推荐

