A tale of technicalities
In theory, there's relatively simple maths behind all the formulas used to calculate, or rather, estimate the catch rate of an encounter. Reality looks quite a bit different though. With differences throughout all generations, sometimes even within a generation, straight up errors made by the devs and limitations of hardware, plenty of little things have to be considered. Let's get into it. Our cute little friend Rattata is gonna help us out here and there.
Gen 1
Gen 1 is a really interesting one. Being different from all other generations, this one is full of surprises that made creating a calculator quite the trial-and-error experience.
Also, our cute little Rattata's mom, Raticate, has a lower capture rate in Gen 1 and Gen 2 from all other games.
Floating point numbers aren't real
Calculating anything from a Pokémon's stats to variable factors can result in decimals. Gen 1 doesn't support, or rather, consider that, however. Instead of mathematically rounding values (down until .4 and up beginning with .5), Gen 1 simply cuts off the decimals, essentially flooring all values.
RNG isn't real either
There's no such thing as true randomness on computers. Since a random factor is being used in the Gen 1 formula, though, this means the results in these games are sometimes different from what the math would suggest when using Great Balls or Ultra Balls. This is explained really well on The Cave of dragonflies, so I won't even try to repeat it here in my own words.
We're showing intended catch rate here, not actual catch rate.
The ball factor
Great Balls have a different factor attached to it than all the other balls. Due to how the capture formula works, however, this can result in a Great Ball being a better option than an Ultra Ball. (see the RNG section) This effects mostly Pokémon at high or full HP and Pokémon with a high capture rate.
Differences between Red/Blue and Yellow
Pokémon Yellow uses different reroll counts (see the RNG section) effecting the actual catch rate.
Besides that, the only differences are the lower capture rates of Dragonair and Dragonite.
Gen 2
Gen 2 is the beginning of more streamlined formulas that are less convoluted, but, due to its implementation in the games, still heavily buggy and sometimes even gamebreaking.
For Pokémon differences, there's still only Raticate with a lower capture rate before Gen 3.
Once upon a time in a world that wasn't tested properly
The majority of unexpected results stem from implementation errors surrounding the different new Pokéball variants. The Fast Ball, Heavy Ball, Love Ball and Moon Ball do not (always) work as intended. To make matters worse, the only status effects that improve the catch rate at all are Sleep and Freeze. An in-depth explanation can be found, once again, on The Cave of dragonflies.
Differences between Gold/Silver and Crystal
Pokémon Crystal reads Kadabra's, Tauros' and Sunflower's weight incorrectly and thus assumes the max weight tier when trying to capture them using a Heavy Ball.
Things that cannot be
All of a Pokémon's stats are non-decimal values. Whenever you are choosing a percentage of HP left, however, this could in theory result in a decimal value. This cannot happen during combat. An attack's damage is always non-decimal, too. This means that we have to make a decision on what to do with impossible solutions like this. An example:
A level 50 Rattata with 0 DVs/IVs is gonna have 90 HP at full health.
If you were to set its health to 35%, you'd end up with 31.5 HP. That's impossible in-game. No matter how much damage had been dealt and how, it would have always ended up with either 31 HP or 32 HP.
Since Gen 1 floors all values, we've decided to floor situations like this, too. Doing this might end up causing different results to other websites providing calculations and this is the most likely reason for it.
Rounding up or down?
Just like rounding during the calculations and when deciding on HP values using percentages, rounding is done when displaying the final results. We decided to mathematically round each decimal from the last decimals all the way to the integer part. This is technically neither right nor wrong, since the games will only ever work with one specific IV/HP/XYZ set of Pokémon wheras we simulate all kinds of possible encounters and then display the average. This means that other websites may show slightly different catch rates, sometimes off by just 0.01.