[Ka-Ping Yee] >> >>> 3.3 >> 3.2999999999999998 > >> confused and frightened them, and continues to confuse and frighten >> almost everyone i teach. [Jim Jewitt] > It bothered me when I first saw it (not in Python). > > It was still better than trying to figure out why my code was doing > the wrong thing, when my math and logic were both clearly correct. > > To steal Simon Percivall's example, I assumed 2.20 - 1.20 == 1.00. > It didn't even occur to me to check something as obviously true as > that -- until I had learned and remembered that floats were not > decimals. I believe Ping would have >>> 2.20 - 1.20 1.0000000000000002 because "1.0000000000000002" is the shortest string that evals to the true machine result. OTOH, he'd have >> 2.20 - 1.10 1.1 The true machine result isn't decimal 1.1, but "1.1" is again the shortest string that evals to the true machine result. Presumably newbies aren't confused or frightened by 1.0000000000000002, because their intuition about shortest-possible reproducing decimal representations of binary floats is finely honed <wink>. Most people should use Decimal: >>> print Decimal("2.20") - Decimal("1.20") 1.00 >>> print Decimal("2.20") - Decimal("1.1") 1.10 The output is "what they expect" then, 100% truthful (the internal results are exactly 1. and decimal 1.1, respectively), and even preserves a useful notion of significant trailing zeroes.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4