It makes a difference to the calculated value .... Only difference between
two functions below is one sets decimal to 2 and other to 16. The 16 version
produces expected results.
? DectoBase36_2(2176782335), DectoBase36(2176782335), "Expecting ZZZZZZ" &&
Returns "100000", "ZZZZZZ"
? DectoBase36_2(2176782334), DectoBase36(2176782334), "Expecting ZZZZZY" &&
Returns "100000", "ZZZZZY"
lnVal = 2176782335
SET DECIMALS TO 2
? INT(LOG(m.lnVal) / LOG(36)), "Expecting 5" && Returns 6
SET DECIMALS TO 16
? INT(LOG(m.lnVal) / LOG(36)), "Expecting 5" && Returns 5
FUNCTION DectoBase36
LPARAMETERS vnVal
LOCAL lnDecimals, lnPwr, lcString, lnMult, lnInt
STORE "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" TO lcValues
lndecimals = SET("DECIMALS")
SET DECIMALS TO 16
lnPwr = INT(LOG(m.vnVal) / LOG(36))
lcString = ""
FOR ln = m.lnPwr TO 0 STEP -1
lnMult = 36^m.ln
lnInt = INT(m.vnVal / m.lnMult)
vnVal = m.vnVal -(m.lnInt * lnMult)
lcString = m.lcString + SUBSTR(m.lcValues, m.lnInt + 1, 1)
ENDFOR
SET DECIMALS TO m.lndecimals
RETURN lcString
ENDFUNC
FUNCTION DectoBase36_2
LPARAMETERS vnVal
LOCAL lnDecimals, lnPwr, lcString, lnMult, lnInt
STORE "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" TO lcValues
lndecimals = SET("DECIMALS")
SET DECIMALS TO 2
lnPwr = INT(LOG(m.vnVal) / LOG(36))
lcString = ""
FOR ln = m.lnPwr TO 0 STEP -1
lnMult = 36^m.ln
lnInt = INT(m.vnVal / m.lnMult)
vnVal = m.vnVal -(m.lnInt * lnMult)
lcString = m.lcString + SUBSTR(m.lcValues, m.lnInt + 1, 1)
ENDFOR
SET DECIMALS TO m.lndecimals
RETURN lcString
ENDFUNC
-----Original Message-----
From: ProfoxTech [mailto:[email protected]] On Behalf Of Ted
Roche
Sent: Monday, 31 July 2017 10:05 PM
To: [email protected]
Subject: Re: SET DECIMALS Gotcha
>
> I have just been bitten by SET DECIMALS. (Is there really any
> use for this besides making programming just a bit more difficult?)
>
There may have been, when it was invented in the dBASE days. I believe it
does not affect values, only their display.
> I have a table with values to four decimal places. I use <vfp>
> transform(thevalue,"999999.9999") </vfp> to create the
> string representation. With SET DECIMALS set to its default
> value, a value of 0.0123 is converted to " 0.0100" which loses two
> digits of precision.
What if you multiplied the number by 10^4? Would the precision still be
there, only not displayed?
> I had this problem with another data item that had more than two
> decimal places. I wrote a special function to handle it by setting
> SET DECIMALS to the number of decimal places I needed, doing the
> transform(), and setting SET DECIMALS back to the default.
> Why did I do that?
That is probably the crux of the matter.
> BUT also, because I
> really do not understand the point of SET DECIMALS.
>
Is there someplace you could look it up? A reference guide of some sort?
--
Ted Roche
Ted Roche & Associates, LLC
http://www.tedroche.com
[excessive quoting removed by server]
_______________________________________________
Post Messages to: [email protected]
Subscription Maintenance: http://mail.leafe.com/mailman/listinfo/profox
OT-free version of this list: http://mail.leafe.com/mailman/listinfo/profoxtech
Searchable Archive: http://leafe.com/archives/search/profox
This message:
http://leafe.com/archives/byMID/profox/[email protected]
** All postings, unless explicitly stated otherwise, are the opinions of the
author, and do not constitute legal or medical advice. This statement is added
to the messages for those lawyers who are too stupid to see the obvious.