VB & fix() function
5 отговора
171 прегледа
VB & fix() function
някой знае ли каква е причината следните 2 реда да дават различен резултат?
това грешка в VB ли е или така трябва да работи?
print fix ((3.795 + 0.005)*100)/100
3,79
v= (3.795 + 0.005)*100 : print fix (v)/100
3,8
това грешка в VB ли е или така трябва да работи?
print fix ((3.795 + 0.005)*100)/100
3,79
v= (3.795 + 0.005)*100 : print fix (v)/100
3,8
Re: VB & fix() function
Ами, и аз съм забелязал малко проблеми със дробни числа от 3-тия знак след запетаята, но не съм си правил труда да търся защо. Със INT() прави същото, така че... Просто ползвай:
Print Round((3.795 + 0.005), 2)
Така работи.
----------------------------------
помислих, хареса ми, помислих пак...
Print Round((3.795 + 0.005), 2)
Така работи.
----------------------------------
помислих, хареса ми, помислих пак...
Re: VB & fix() function
лошото на Round че загръглява на четно и нечетно
print Round(3.785,2)
3,78
print Round(3.795,2)
3,8
и не става
целта ми е да заграглявам от 5 винаги нагоре и това с кода от предня пост ако в скобите преди Fix се кастне до Double
прочетох че 3.785 всъшност било 3.7849999..... ама не ми е ясно защо като се кастне до Double става 3.785 за да ми излезе сметката
print Round(3.785,2)
3,78
print Round(3.795,2)
3,8
и не става
целта ми е да заграглявам от 5 винаги нагоре и това с кода от предня пост ако в скобите преди Fix се кастне до Double
прочетох че 3.785 всъшност било 3.7849999..... ама не ми е ясно защо като се кастне до Double става 3.785 за да ми излезе сметката
Re: VB & fix() function
Heh :)
Dim V As Double
Debug.Print Fix((CSng(3.795) + CSng(0.005)) * 100) / 100
V = (3.795 + 0.005) * 100
Debug.Print Fix(V) / 100
:::::))))
Probvai da izpolzva6 CSng :))) Probvai i s po-to4noto CCur !! :)
Operaciite sys Double sa mnogo neto4ni - naprimer:
Dim V As Double
Dim lngL As Long
For lngL = 1 To 10000
V = V + 0.0001
Next lngL
Debug.Print V
Rezyltata nqma da e 1 ami 0,999999999999906 :)))
samo zamesti tova "V = V + 0.0001" sys "V = V + CCur(0.0001)" i gledai kvo stava :)) - rezyltata stava to4no 1
Dim V As Double
Debug.Print Fix((CSng(3.795) + CSng(0.005)) * 100) / 100
V = (3.795 + 0.005) * 100
Debug.Print Fix(V) / 100
:::::))))
Probvai da izpolzva6 CSng :))) Probvai i s po-to4noto CCur !! :)
Operaciite sys Double sa mnogo neto4ni - naprimer:
Dim V As Double
Dim lngL As Long
For lngL = 1 To 10000
V = V + 0.0001
Next lngL
Debug.Print V
Rezyltata nqma da e 1 ami 0,999999999999906 :)))
samo zamesti tova "V = V + 0.0001" sys "V = V + CCur(0.0001)" i gledai kvo stava :)) - rezyltata stava to4no 1
работата изглежда по-интересна
значи пробвах примера който даде на Турбо бейсик 1.0, писан още когато 640к памет са имали само паралиите. та там ефекта е същия, макар че променливите са с размер 4 байта т.е. не са double. според мене в първия случай компилатора извършва изчислението и записва в променливата резултата, а във втория програмата. за да проверя това заместих в първия израз константите 3.795 и 0.005 с променливи за да го принудя да компилира код за изчислението. тогава се получи правилната стойност 3.8
Re: VB & fix() function
мерси на всички за отговорите
всщност очаквах резултата да е като
printf("%f", ((int)((3.795 + 0.005)*100))/100.0);
double c = 3.795;
printf("%f", ((int)((c + 0.005)*100))/100.0);
не толкова какво ще се получи - поне да е едно и също :)
накрая го фикснах с с променлива от тип Currency за 3.795 и резултата от функцията. изглежда работи.
преди бях сложил Double и юзерите са работи така 2месеца и са омазали всичко, ама такъв е живота
всщност очаквах резултата да е като
printf("%f", ((int)((3.795 + 0.005)*100))/100.0);
double c = 3.795;
printf("%f", ((int)((c + 0.005)*100))/100.0);
не толкова какво ще се получи - поне да е едно и също :)
накрая го фикснах с с променлива от тип Currency за 3.795 и резултата от функцията. изглежда работи.
преди бях сложил Double и юзерите са работи така 2месеца и са омазали всичко, ама такъв е живота