Nieoczekiwane wyniki podczas pracy z bardzo dużymi liczbami całkowitymi w językach interpretowanych

Próbuję uzyskać sumę1 + 2 + ... + 1000000000, ale otrzymuję śmieszne wyniki w PHP iNode.js.

PHP

$sum = 0;
for($i = 0; $i <= 1000000000 ; $i++) {
    $sum += $i;
}
printf("%s", number_format($sum, 0, "", ""));   // 500000000067108992

Node.js

var sum = 0;
for (i = 0; i <= 1000000000; i++) {
    sum += i ;
}
console.log(sum); // 500000000067109000

Prawidłową odpowiedź można obliczyć za pomocą

1 + 2 + ... + n = n(n+1)/2

Prawidłowa odpowiedź =500000000500000000, więc postanowiłem spróbować innego języka.

UDAĆ SIĘ

var sum , i int64
for i = 0 ; i <= 1000000000; i++ {
    sum += i
}
fmt.Println(sum) // 500000000500000000

Ale to działa dobrze! Więc co jest nie tak z moim kodem PHP i Node.js?

Być może jest to problem języków interpretowanych i dlatego działa w języku skompilowanym, takim jak Go? Jeśli tak, czy inne interpretowane języki, takie jak Python i Perl, będą miały ten sam problem?

questionAnswers(30)

yourAnswerToTheQuestion