< návrat zpět

MS Excel


Téma: vba - 100 nerovná se 100? rss

Zaslal/a 19.10.2016 5:02

Pěkný den.
Narazil jsem na problém s přičítáním. Více je snad zřejmé z přiloženého kódu (kód upraven jen pro pochopení problému). Jde o to že proměnná Z ke konci kódu se tváří že obsahuje 100, ale přesto obsahuje jiné číslo.
Jak zobrazím(vypočítám) skutečnou hodnotu v proměnné Z, nebo kde je chyba?

Kód jsem upravil vložením řádky s převodem do stringu a zpět a je funkční, přesto mě to vrtá hlavou.


Sub NAWEB()
Dim X As Single
Dim Y As Single
Dim Z As Single
X = 100 / 30
Y = X * 30 ' v Y je výsledek opravdu znovu 100
For CK = 1 To 30
Z = Z + X ' postupně zpět podíl přičítá
Next CK
' po ukončení cyklu je v Z výsledek 100, ale jen se tak "tváří"
If Y = 100 Then Stop ' v pořádku, zastaví se
'Z = Str(Z): Z = Val(Z) ' pokud tento řádek povolím, už to funguje
If Z = 100 Then Stop ' NEZASTAVÍ SE PROTOŽE 100 SE NEROVNÁ 100 ??
Z = Z * 1000
If Z = 100000 Then Stop ' ani různé matematické operace nepomůžou

End Sub

Zaslat odpověď >

icon #033115
eLCHa
Nic osobního, ale hledal jste nebo jste to sem rovnou práskl. To je totiž pořád dokola...

https://en.wikipedia.org/wiki/Floating_point

NEZASTAVÍ SE PROTOŽE 100 SE NEROVNÁ 100
Je to přesně tak
do immediate window napište
?Z-100 a stiskněte ENTER
výsledek
1,525879E-05

Příčinu znáte, řešení záleží na situaci.

Toto nepoužívejte
Z = Str(Z): Z = Val(Z) ' pokud tento řádek povolím, už to fungujecitovat
#033118
avatar
Ono kdo prošel nějakým měřením, i kdyby na škole, tak ví, že by měl spíš udělat rozdíl dvou čísel v absolutní hodnotě a ten porovnávat s dovolenou odchylkou. Ten, kdo má základy matematiky, tak ví, že ne všechna čísla lze vyjádřit přesně, ví, jak čísla vůbec dělíme. Ostatně ne všechny matematické operace a úkony jsou povoleny (dodnes si pamatuju, jak nám učitel ukazoval, že "dvě nerovná se dvě"). Ten, kdo má základy pravděpodobnosti a statistiky zná další pojmy, jako rozdělení náhodné veličiny, intervaly spolehlivosti, veličiny popisné statistiky atd. Ten kdo má základy počítačů, ví, že ve dvojkové soustavě je to ještě o chlup horší, řeší se plovoucí desetinná čárka, nějak pracuje procesor, nějak systém, nějak Excel, nějak je s čísly zacházeno v rámci paměti a pod programovacím jazykem, nějak pracují konverzní funkce.

Jednoduše:

|A-B| a porovnávat s dovolenou odchylkou.citovat
#033137
avatar
Děkuji za odpovědi.
Bohužel špatně jsem se vyjádřil, moje chyba.
Nešlo o to jak VBA přičítá, ale o rozpor hodnoty proměnné v okně Locals a opravdovou hodnotou v proměnné. To mě zmátlo při ladění kódu. I převod do stringu nefuguje (často potřebuji), alespoň jak bych si já představoval.
Sub NAWEB2()
Dim X As Single, Z As Single, Q As Double
Dim A As String
X = 100 / 30
For CK = 1 To 30
Z = Z + X ' postupně zpět podíl přičítá
Next CK

Cells(1, 1) = Z ' vypíše 100,000015258789 -OK, ale v okně Locals se rovná 100
A = Str(Z) ' převede též 100,000015258789 jen na 100
Cells(2, 1) = A

Q = Z ' jakmile zkopíruji proměnnou do dat.typu Double už vše funguje jak má
Cells(3, 1) = Q
A = Str(Q)
Cells(4, 1) = A
End Sub
citovat
icon #033141
eLCHa
nemyslím si, že je tam rozpor.
Ta hodnota bude 100,00001525879 - locals zobrazuje pouze 100.citovat
#033149
avatar
Ahoj, téma Single vs Double je už řádně fousaté.citovat

Uživatelské menu

Nejste přihlášen(a)
avatar\n

Menu

Formulář Faktura

Formulář Faktura IV

Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.

Helios iNuvio

Používáte podnikový systém Helios iNuvio? Potřebujete pomoci se správou nebo vyvinout SQL proceduru? Více informací naleznete na stránce Helios iNuvio.

On-line nástroje