
rust 的 `..` 是左闭右开区间,而 go 和 ruby 默认未包含上界,若不统一边界逻辑会导致累加结果偏差;本文通过代码对比与修正,阐明三语言在整数范围遍历中的关键差异及正确写法。
在 Rust 中,0is..100000000is 表示从 0(含)到 100000000(不含)的整数序列,即实际遍历 0, 1, 2, ..., 99999999 —— 共 100,000,000 个数,其数学和为:
$$ \sum_{i=0}^{99999999} i = \frac{99999999 \times 100000000}{2} = 4999999950000000 $$
而原始 Go 与 Ruby 示例中,循环条件分别为 i 未包含 99999999,且起始值为 1(非 0),因此实际计算的是:
$$ \sum_{i=1}^{99999998} i = \frac{99999998 \times 99999999}{2} = 4999999850000001 $$
这正是你观察到的结果差异根源:不仅起始点不同(0 vs 1),上界包容性也不同(Rust 包含 99999999,Go/Ruby 均排除)。
✅ 正确对齐逻辑的写法如下:
Rust(推荐使用现代语法,is 已废弃):
fn main() {
let mut sum = 0i64;
for i in 0..=99999999 { // 使用 ..= 表示闭区间 [0, 99999999]
sum += i;
}
println!("{}", sum); // 输出:4999999950000000
}Go(修正为包含 99999999,且用 int64 避免溢出):
package main
import "fmt"
func main() {
var sum int64 = 0
for i := int64(0); i <= 99999999; i++ {
sum += i
}
fmt.Println(sum) // 输出:4999999950000000
}Ruby(使用 .. 表示包含上界):
sum = 0
(0..99999999).each { |i| sum += i }
puts sum # 输出:4999999950000000⚠️ 注意事项:
- Rust 中 .. 永远是左闭右开(如 a..b → a ≤ x
- Go 的 for i := 0; i
- Ruby 的 ... 是左闭右开(等价 Rust ..),.. 是左闭右闭(等价 Rust ..=);
- 大数累加务必注意整数类型宽度:i32 在 Rust 或 int(32 位)在 Go 中会溢出,应显式使用 i64/int64;
- 数学上更高效的方式是直接使用高斯求和公式:(n as i64) * (n + 1) as i64 / 2,避免循环开销。
总结:跨语言迁移循环逻辑时,必须显式校验区间语义(开/闭)、起始偏移与数据类型,不可依赖直觉。统一边界定义后,三语言结果完全一致。










