Issue 14896: plistlib handling of real datatype (original) (raw)
Issue14896
Created on 2012-05-24 01:16 by pvg, last changed 2022-04-11 14:57 by admin. This issue is now closed.
Messages (2) | ||
---|---|---|
msg161471 - (view) | Author: Peter VG (pvg) | Date: 2012-05-24 01:16 |
Since strings cannot reliably be converted to floats and back, plistlib should provide an option to treat the real datatype as strings/data or to use the Decimal library class. Currently, reading and then writing a real value can change its representation in the plist even if it has not been modified. For instance: Read: 0.015 Written: 0.014999999999999999 or Read: 0.4 Written: 0.40000000000000002 | ||
msg161477 - (view) | Author: Ned Deily (ned.deily) * ![]() |
Date: 2012-05-24 03:17 |
This should no longer be an issue on most platforms as of Python 2.7 and Python 3.1. Both added a new algorithm such that "the repr() of a floating-point number x now returns a result based on the shortest decimal string that’s guaranteed to round back to x under correct rounding". The new float repr applies to plistlib as well. Here's an example: $ cat pl.py from plistlib import readPlistFromString, writePlistToString d1 = dict(a=0.15) s1 = writePlistToString(d1) print(s1) d2 = readPlistFromString(s1) print(d2) assert d1['a'] == d2['a'] print(d2['a'].hex()) $ python2.6 pl.py a 0.14999999999999999 {'a': 0.14999999999999999} 0x1.3333333333333p-3 $ python2.7 pl.py a 0.15 {'a': 0.15} 0x1.3333333333333p-3 Note that the binary representation of the float is the same on both 2.6 and 2.7 in this case anyway. For more info, see: http://docs.python.org/py3k/whatsnew/3.1.html#other-language-changes http://docs.python.org/whatsnew/2.7.html#other-language-changes |
History | |||
---|---|---|---|
Date | User | Action | Args |
2022-04-11 14:57:30 | admin | set | github: 59101 |
2012-05-24 03:17:00 | ned.deily | set | status: open -> closednosy: + ned.deilymessages: + resolution: out of datestage: resolved |
2012-05-24 01:16:54 | pvg | create |