For surface codes, the syndrome measurements collapse the errors into either being $X$ or $Z$ errors. All Clifford gates have easy-to-compute commutation relations with $X$ and $Z$ gates. So the idea is not to actually correct the errors, since that would require more quantum operations which are difficult and error-prone, but to simply track the errors and ...
I expect you get the Noise Model from the calibrated data of the hardware, however I am not sure how often it is updated. I doubt that it is live or even daily.
You can check the noise model by running
noise_model._local_quantum_errors and noise_model._local_readout_errors
device = provider.get_backend('ibmq_armonk')
noise_model = NoiseModel....
IBM Quantum Systems are calibrated daily, and the system properties update once this calibration sequence is complete. It means that your noise model could change on a daily basis.
More information in the documentation:
As mentioned by @user47787
This is yet another case of floating-point representation error at the machine level.
This behaviour is language agnostic and has nothing to do with Python or Numpy or Qiskit.
A very old post on stackoverflow discussing this issue - Is Floating Point Math broken ?
Python docs describing the same - Floating Point ...