------------------------------------------------------------------------------------------------------------
[BUG/PRB.] VFP 9.0 FIX - ADJUST THE PRECISION OF THE FLOATING-POINT NUMBERS FOR THE STR() FUNCTION
January 2026
------------------------------------------------------------------------------------------------------------
CCB
1. BUG:
There is a test program:
*PROC teststrfunction
?STR(1.154985,8,2) && Displays 1.15
?STR(1.154995,8,2) && Displays 1.16
WAIT
RETURN
* END OF PROC TESTSTRFUNCTION.
We think they will display 1.15, but:
?STR(1.154995,8,2) && Displays 1.16
2. CAUSE:
When VFP 9.0 and earlier versions calculate STR(1.154995,8,2),
it will adjust the precision of the nExpression paramater with the nDecimalPlaces paramater:
1. 1549 9499 9999 9999 940
+ 0. 0000 0500 0000 0000 0 (n=2, eps = 0.5*10^(-(n+3)) = 5.0000000000000004090e-06)
----------------------------
1. 1550 0000 0000 0000 270
ROUND(1.1550000000000000270,2) = 1.16
So STR(1.154995,8,2) = "1.16".
When VFP Advanced calculates STR(1.154995,8,2),
if the number of decimal places of the nExpression paramater is greater than the nDecimalPlaces paramater,
it will adjust the precision of the nExpression paramater with the number of decimal places of the nExpression paramater:
1. 1549 9499 9999 9999 940
+ 0. 0000 0000 0500 0000 0 (n=6, eps = 0.5*10^(-(n+3)) = 5.0000000000000003120e-10)
----------------------------
1. 1549 9500 0500 0000 350
ROUND(1.1549950005000000350,2) = 1.15
So STR(1.154995,8,2) = "1.15".
When VFP (VFP Advanced, VFP 9.0 and earlier versions) calculate TRANSFORM(1.154995),
it will adjust the precision of the nExpression paramater with the number of decimal places of the nExpression paramater,
and then calculate ROUND(1.154995,6) = 1.154995,
and then transform it with the format code "#.######",
so TRANSFORM(1.154995) = "1.154995".
So there is no the bug for the TRANSFORM() function.
3. RESOLUTION:
We can write some code to fix the BUG.
Fun53ead3 :: ; proc near
push ebp ;0x0053ead3 : 55
mov ebp , esp ;0x0053ead4 : 8bec
sub esp , 0110h ;0x0053ead6 : 81ec10010000
fld qword ptr [ Data91fbc8 ] ;0x0053eadc : dd05c8fb9100
mov eax , dword ptr [ Data937090 ] ;0x0053eae2 : a190709300
fld qword ptr [ ebp + 20 ] ;0x0053eae7 : dd4514
push ebx ;0x0053eaea : 53
push esi ;0x0053eaeb : 56
fucompp ;0x0053eaec : dae9
push edi ;0x0053eaee : 57
mov edi , ecx ;0x0053eaef : 8bf9
mov ecx , dword ptr [ ebp + 26 ] ;0x0053eaf1 : 8b4d1a
shr ecx , 04h ;0x0053eaf4 : c1e904
mov dword ptr [ ebp - 8 ] , eax ;0x0053eaf7 : 8945f8
fstsw ax ;0x0053eafa : dfe0
and ecx , 07FFh ;0x0053eafc : 81e1ff070000
sub ecx , 03FFh ;0x0053eb02 : 81e9ff030000
test byte ptr ah , 044h ;0x0053eb08 : f6c444
jnp Label53eb1d ;0x0053eb0b : 7b10
mov eax , ecx ;0x0053eb0d : 8bc1
cdq ;0x0053eb0f : 99
xor eax , edx ;0x0053eb10 : 33c2
sub eax , edx ;0x0053eb12 : 2bc2
cmp eax , 03Fh ;0x0053eb14 : 83f83f
jnl Label59adea ;0x0053eb17 : 0f8dcdc20500
Label53eb1d ::
pushd 012h ;0x0053eb1d : 6a12
pop edx ;0x0053eb1f : 5a
cmp edi , edx ;0x0053eb20 : 3bfa
jnl Label53eb26 ;0x0053eb22 : 7d02
mov edx , edi ;0x0053eb24 : 8bd7
;
; -------------------------------------------------------------------------------------------------
; VFP 9.0 FIX - ADJUST THE PRECISION OF THE FLOATING-POINT NUMBERS FOR THE STR() FUNCTION
; November 2019
; -------------------------------------------------------------------------------------------------
; CCB
;
; Adjust the precision of the floating-point numbers for the STR() function.
;
; 2019/11/8, by ccb
;
cmp dword ptr vfpa_sys9026_data,00h
je Label53eb26
cmp dword ptr [ esp + 120h ] , offset Label4ff6af ;; Label4ff587 ..
jne Label53eb26
cmp byte ptr [ebx],04Eh
jne Label53eb26
cmp edx,dword ptr [ebx+08h]
jae Label53eb26
mov edx,dword ptr [ebx+08h]
Label53eb26 ::
lea ecx , dword ptr [ ebp + 20 ] ;0x0053eb26 : 8d4d14
call Fun53e46a ;0x0053eb29 : e83cf9ffff
Label53eb2e ::
fld qword ptr [ ebp + 20 ] ;0x0053eb2e : dd4514
push ecx ;0x0053eb31 : 51
push ecx ;0x0053eb32 : 51
fstp qword ptr [ esp ] ;0x0053eb33 : dd1c24
pushd 01h ;0x0053eb36 : 6a01
lea eax , dword ptr [ ebp + 0FFFFFEF4h ] ;0x0053eb38 : 8d85f4feffff
push eax ;0x0053eb3e : 50
push edi ;0x0053eb3f : 57
call Fun53e49b ;0x0053eb40 : e856f9ffff
mov esi , dword ptr [ ebp + 12 ] ;0x0053eb45 : 8b750c
mov ebx , eax ;0x0053eb48 : 8bd8
sub esi , ebx ;0x0053eb4a : 2bf3
je Label4e9c37 ;0x0053eb4c : 0f84e5b0faff
test esi , esi ;0x0053eb52 : 85f6
jle Label4a5e90 ;0x0053eb54 : 0f8e3673f6ff
mov edi , dword ptr [ ebp + 8 ] ;0x0053eb5a : 8b7d08
mov ecx , esi ;0x0053eb5d : 8bce
mov edx , ecx ;0x0053eb5f : 8bd1
shr ecx , 02h ;0x0053eb61 : c1e902
mov eax , 020202020h ;0x0053eb64 : b820202020
rep stosd ;0x0053eb69 : f3ab
mov ecx , edx ;0x0053eb6b : 8bca
and ecx , 03h ;0x0053eb6d : 83e103
rep stosb ;0x0053eb70 : f3aa
mov edi , dword ptr [ ebp + 8 ] ;0x0053eb72 : 8b7d08
push ebx ;0x0053eb75 : 53
lea ecx , dword ptr [ edi + esi ] ;0x0053eb76 : 8d0c37
lea edx , dword ptr [ ebp + 0FFFFFEF4h ] ;0x0053eb79 : 8d95f4feffff
call Fun42c19b ;0x0053eb7f : e817d6eeff
mov eax , dword ptr [ ebp + 12 ] ;0x0053eb84 : 8b450c
mov byte ptr [ edi + eax ] , 00h ;0x0053eb87 : c6040700
Label53eb8b ::
xor eax , eax ;0x0053eb8b : 33c0
Label53eb8d ::
mov ecx , dword ptr [ ebp - 8 ] ;0x0053eb8d : 8b4df8
call Fun42bf1d ;0x0053eb90 : e888d3eeff
pop edi ;0x0053eb95 : 5f
pop esi ;0x0053eb96 : 5e
pop ebx ;0x0053eb97 : 5b
leave ;0x0053eb98 : c9
ret 014h ;0x0053eb99 : c21400
4. APPLIES TO:
VFP 6.0.8167.0
VFP 6.0.8961.0 (SP5)
VFP 7.0.0.9262
VFP 7.0.0.9465 (SP1)
VFP 8.0.0.2521
VFP 8.0.0.3117 (SP1)
VFP 9.0.0.2412
VFP 9.0.0.3504 (SP1)
VFP 9.0.0.4611 (SP2)
VFP 9.0.0.5015 (SP2)
VFP 9.0.0.5411 (SP2)
VFP 9.0.0.5721 (SP2)
VFP 9.0.0.5815 (SP2)
VFP 9.0.0.6303 (SP2)
VFP 9.0.0.6602 (SP2)
VFP 9.0.0.7423 (SP2)
The bug has been fixed in VFP Advanced.
5. REFERENCE WEBSITES:
1, baiyujia.com:
http://www.baiyujia.com
http://www.baiyujia.com/vfpdocuments/f_vfp9fix97.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix23.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix24.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix37.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix38.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix123.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix124.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix255.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix256.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix257.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix258.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix259.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix260.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix303.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix304.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix305.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix306.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix373.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix374.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix409.asp
2, foxite.com:
https://www.foxite.com/archives/str-rounding-problem-0000469888.htm
6. OTHER:
For reference only, there is no guarantees.
Any questions or suggestions, please send me an email at ccb2000@163.com.
|