Template:Precision

<!--endexpr# (close paren.) -- -- --NOTES: --   [ These comments are skipped by and not send --     inside formatted Internet pages, only during edit. ] -- --NOTE A1: This template determines the precision of decimals --    by counting the length of the numeric string (in a --     #switch comparing lengths of padded strings), then --    subtracting integer length, minus the decimal point, --    and minus 1 if negative. For integers, 1 place is --    subtracted for each trailing 0 on the integer. --    For fractions, any prior count is cleared x 0, then --    size is logarithm of denominator divided by logn 10: --    (..prior...)*0 + floor(logn denom / logn 10 - .01) + 1. -- --NOTE D2: The check, for whole integers, compares the amount --    versus appending "0" at the end: when the amount is a --     decimal, then the value is unchanged by appending 0 at --     the end: so 5.23 = 5.230 is true, whereas for whole --    integers, it would be: 5 = 50 as false, due to values --    becoming n*10 for integer n. So, for integer n, the --    check rejects: n = n0 as false; hence n is integer. -- --NOTE M3: The magnitude of the integer portion is calculated --    by logarithm of the floor of absolute value (divided by --     natural logarithm of 10 to adjust for e=2.71828*), --    as: ln (floor( abs )+0.99 )/ln10 --    Function floor(x) trims the decimal part, to leave the --    whole count: 0-9 yield 0, 10-19 as 1, 1000-1999 as 3. --    The abs(x) avoids floor of negatives, floor(-0.1)= -1, --    hence using abs(x) ensures -0.1 floors to 0 not -1. --    Near zero, the +0.99 avoids invalid log of 0, but does --    not round-up any decimals, already floored as nnn.00. --    Complexity is 6 operations: floor of abs( {1} ) +0.99 --    then logn div logn10, then floor that logarithm ratio. --    Decimals -1 < x < 1 yield -1, avoiding log 0.001 = -3. -- --NOTE N4: Nesting of if-else and nested templates is kept to --    a minimum, due to the MediaWiki 1.6 limit of 40 levels --    of if-logic for all nested templates used together. --    Template {ordomag} was omitted to avoid 2 more levels --    of nested templates. Template {Precision} had 8 levels, --    and this template was trimmed to only 5 levels. -- --NOTE S5: The #switch is run with "x" prepended in front of --    the amount, otherwise a #switch will compare as numeric --    where 2 would match "2.0" even though "2" is length 1. --    So "x2" won't match "x2.0" in non-numeric comparison. --    The #switch will exit on the first match, so smaller --    lengths are compared first, to avoid extra comparisons --    for more rare, longer numeric strings up to 41 long. -- --NOTE W6: The check for integers with whole end-zeroes uses --    typical n=n/10*10, for each power of 10, where whole --    millions match: --    Previously, {Precision} had tried to use "round" to --     detect end-zeroes but "round" loses precision at -5, --    so, n00000 round -5 differs from n00000 slightly, and --    comparisons to exact rounded amounts failed to match --    some numbers when 6 or more zeroes "n000000". -- --NOTE Z7: The check on zero for any .00000 compares adding 1 --    to the amount, versus appending "1" at the end: if the --    amount is a decimal, then adding 1 will be larger than --    appending 1 at the end: 0.00 + 1 > 0.001, whereas for --    whole zero, it would be: 0+1 > 01 as false, due to the --    value being the same. So, for integer 0, the check --    rejects: 0+1 > 01 as false; hence whole 0 is integer. -- -- WARNING: *** DO NOT DELETE COMMENTS FROM THIS TEMPLATE *** --     Unless these comments are readily available, people --     might tinker with the coding (or rename templates), --     in hopes to clarify operation because these comments --     were not nearby to explain the issues. Having these --     comments only on a doc-page increases the danger of --      explanations no longer matching the current coding. --     UPDATE these comments to match changes to the template. --     UPDATE the HISTORY during major changes (not typos). -- -- --HISTORY: --15Aug10 Created to get precision even if large or negative. --15Aug10 Put NOTES comments to explain template coding. --15Aug10 Put HISTORY comments to log major changes. --18Aug10 Fixed to handle zero: 0 as 0, 0.000 as 3, etc. --04Sep10 Fixed to handle decimals between 0~1 (by round 0). --04Sep10 Updated NOTES to explain the check appending 0 or 1. --03Jan11 Fix integer end-zeroes: 50 as -1, 500 as -2, 5000 -3. --03Jan11 Omit {Order of Magnitude} for 2 levels less nesting. --03Jan11 Omit {Str_len} for 8 fewer levels of 40-nest limit. --03Jan11 Put "noinclude" around all inter-line HTML comments. --03Jan11 Allow fraction "/": floor(ln denom/ln 10 -.01)+1. --08Feb11 Fixed to not count minus sign on negative integers. --08Feb11 Extended to handle integers with 14 end-zeroes "0". --08Feb11 Ordered length-search by most-likely (rarely 1 or 2). --10Feb11 Re-added NOTES/HISTORY to explain logic & changes. --22Jun11 Move to Precision: no need to keep all three. --22Jun11 No rounding up for fractions (i.e. ln denom/ln 10) -- -->