Bug report
LogRecord.msecs returns an incorrect value when timestamp (self.ct) value has exactly 100ms.
One liner check:
assertint((1677793338.100_000_0-int(1677793338.100_000_0)) *1000) +0.0==100.0
The issue is binary representation of "0.1" / floating point error:
>>># Definition of LogRecord.msecs:>>># https://github.com/python/cpython/blob/12011dd8bafa6867f2b4a8a9e8e54cb0fbf006e4/Lib/logging/__init__.py#L343>>># int((ct - int(ct)) * 1000) + 0.0>>>ct=1677793338.100_000_0>>>ct1677793338.1>>>ct-int(ct)
0.09999990463256836>>> _ *100099.99990463256836>>>int(_)
99>>> _ +0.099.0
Your environment
- CPython versions tested on:
- Operating system and architecture:
- Custom company OS based on Debian Testing
- 64-bit
Discussion
I think switching to time.time_ns when setting the creation time might be one solution.
Linked PRs
Bug report
LogRecord.msecsreturns an incorrect value when timestamp (self.ct) value has exactly 100ms.One liner check:
The issue is binary representation of "0.1" / floating point error:
Your environment
Discussion
I think switching to
time.time_nswhen setting the creation time might be one solution.Linked PRs
time.time_ns()inlogging.LogRecord#102412