Could be numerous things... From a bad charger, to a battery cell being worn entirely (resulting in the lower capacity, but is bad enough to screw the battery) to the charging circuit of the laptop...
I have a laptop here, well, two, one laptop actually refuses to charge the battery fully, and the system can't sense the charge level properly anymore. Put the same battery in another laptop and it goes for ~3 hours fine. So it's mostly the circuit on the motherboard in my case.
Always check the BIOS for battery tests, if you haven't already.