RE: SET DECIMALS Gotcha

Author: Darren

Posted: 2017-07-31 at 07:42:00

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:profoxtech-bounces@leafe.com] On Behalf Of Ted

Roche

Sent: Monday, 31 July 2017 10:05 PM

To: profoxtech@leafe.com

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: ProFox@leafe.com

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/011f01d309fa$69f69cc0$3de3d640$@ozemail.com.au

** 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.

©2017 Darren