Hello:
I have just been bitten by SET DECIMALS. (Is there really any use for this besides making programming just a bit more difficult?)
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.
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? Because the number of decimal places can vary and I was generating a line of print in one line of code, BUT also, because I really do not understand the point of SET DECIMALS.
Could someone please clue me in?
Sincerely,
Gene Wirchenko
SET DECIMALS TO n only works when SET FIXED is ON.
Laurie
On 30 July 2017 at 23:38, Gene Wirchenko genew@telus.net wrote:
Hello:
I have just been bitten by SET DECIMALS. (Is there really any usefor this besides making programming just a bit more difficult?)
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.
I had this problem with another data item that had more than twodecimal 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? Because the number of decimal places can vary andI was generating a line of print in one line of code, BUT also, because I really do not understand the point of SET DECIMALS.
Could someone please clue me in?Sincerely,
Gene Wirchenko
[excessive quoting removed by server]
This works: x = 1.2345 SET DECIMALS TO 4 SET FIXED ON ? TRANSFORM(x, "999.9999")
Laurie
On 31 July 2017 at 11:34, Laurie Alvey trukker41@gmail.com wrote:
SET DECIMALS TO n only works when SET FIXED is ON.
Laurie
On 30 July 2017 at 23:38, Gene Wirchenko genew@telus.net wrote:
Hello:
I have just been bitten by SET DECIMALS. (Is there really any usefor this besides making programming just a bit more difficult?)
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.
I had this problem with another data item that had more than twodecimal 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? Because the number of decimal places can varyand I was generating a line of print in one line of code, BUT also, because I really do not understand the point of SET DECIMALS.
Could someone please clue me in?Sincerely,
Gene Wirchenko
[excessive quoting removed by server]
I have just been bitten by SET DECIMALS. (Is there really any use forthis 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 twodecimal 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?
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 anyuse 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 thestring 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 twodecimal 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]
On Sun, Jul 30, 2017 at 6:38 PM, Gene Wirchenko genew@telus.net wrote:
Hello:
I have just been bitten by SET DECIMALS. (Is there really any use forthis besides making programming just a bit more difficult?)
I have a table with values to four decimal places. I use<vfp> transform(thevalue,"999999.9999") </vfp> to create the string representation.
If you use STR(thevalue,11,4), you should get the result you want.