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) * (Python committer) 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