🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.bazy-danych.msaccess
12 messages
12 total messages Started by Fantom Tue, 08 Dec 2015 13:13
Jak prawidłowo pomnożyc dwie liczby ??
#137068
Author: Fantom
Date: Tue, 08 Dec 2015 13:13
16 lines
1407 bytes
Mam program który pracował przez kilka lat i nagle sie okazuje, że są 
przypadki nieprawidłowej pracy :(
Sa dwa pola :
1) Ilość : typ "podówjna precyzja" miejsc dzisiętnych "Auto"
2) Cena: typ "Walutowy" miejsc dziesietnych 2

I po wykonaniu operacji :
 ROUND([Ilosc]*[Cena_Towaru],2) AS Wartosc
Dla liczb 20,0 i 0,33 otrzymuję .... 65 !

Czy może mi ktoś pomóc z takim dziwnym przykładem ??
Ilość towaru nie może byc liczba całkowitą, potrzebuje czasai do 2-3 miejsc 
po przecinku

pozdrawiam
Fantom 
Re: Jak prawidłowo pomnożyc dwie liczby ??
#137069
Author: LeszekN
Date: Tue, 08 Dec 2015 13:39
15 lines
1558 bytes
Witaj
ja osobiscie nie stosuje ROUND

wole 
Public Function zaok(l, m) As Double
    'zaokrąglenie dla dowolnych liczb dodatnich i ujemnych
    zaok = Format(CDec(l), "0." & String(m, "0"))
End Function

i nigdy nie miałem problemów
amerykanie inaczej zaokrąglają :)


----------
Leszek
Re: Jak prawidłowo pomnożyc dwie liczby ??
#137070
Author: tomasz.szczuko
Date: Tue, 08 Dec 2015 19:37
16 lines
1731 bytes
W dniu wtorek, 8 grudnia 2015 14:39:52 UTC+1 użytkownik LeszekN napisał:
> Witaj
> ja osobiscie nie stosuje ROUND
> 
> wole 
> Public Function zaok(l, m) As Double
>     'zaokrąglenie dla dowolnych liczb dodatnich i ujemnych
>     zaok = Format(CDec(l), "0." & String(m, "0"))
> End Function
> 

Sprawdziłem.
Też zwraca mi 65,00 zamiast 66,00 :(
O co tu biega ??

Fantom
Re: Jak prawidłowo pomnożyc dwie liczby ??
#137071
Author: Fantom
Date: Tue, 08 Dec 2015 19:39
24 lines
1581 bytes
Sprawdziłem.
Też zwraca mi 65,00 zamiast 66,00 :(
O co tu biega ??

Fantom


Użytkownik "LeszekN" <leszeknowak@wp.pl> napisał w wiadomości 
news:61141c54-4def-4ffe-8893-c12dbc01963d@googlegroups.com...
Witaj
ja osobiscie nie stosuje ROUND

wole
Public Function zaok(l, m) As Double
    'zaokrąglenie dla dowolnych liczb dodatnich i ujemnych
    zaok = Format(CDec(l), "0." & String(m, "0"))
End Function

i nigdy nie miałem problemów
amerykanie inaczej zaokrąglają :)


----------
Leszek 
Re: Jak prawidłowo pomnożyc dwie liczby ??
#137072
Author: LeszekN
Date: Tue, 08 Dec 2015 20:53
5 lines
1663 bytes
A pomnóż bez funkcji round, tylko wynik wyświetl np msgbox'ie.
Dane które widzisz na formularzu czyli 20 i 0.33 są inne w rzeczywistości, na 99% mnozysz 0.325 :)

---------
Leszek
Re: Jak prawidłowo pomnożyc dwie liczby ??
#137074
Author: Zbigniew Bratko
Date: Tue, 08 Dec 2015 20:58
40 lines
2038 bytes

Użytkownik "Fantom"  napisał w wiadomości grup
dyskusyjnych:n47bli$72l$1@node1.news.atman.pl...

Sprawdziłem.
Też zwraca mi 65,00 zamiast 66,00 :(
O co tu biega ??

[...]

Po prostu Access tak ma. No może nie tyle  MS Access, co VBA.
Problem znany od baaardzo dawna, a raczej od zawsze.

Przykładowo ze strony:
http://www.faq.accdb.pl/14a_VbaNumbFaq.htm#vba14a_01

Debug.Print 1.015, Round(1.015, 2) ' zwraca 1.01
Debug.Print 1.025, Round(1.025, 2) ' zwraca 1.02
Debug.Print 1.075, Round(1.075, 2) ' zwraca 1.08
Debug.Print 1.085, Round(1.085, 2) ' zwraca 1.08

Polecam rozwiązania na stronie Krzysztofa Pozorka:
http://www.access.vis.pl/af0808.htm

ale najwięcej informacji można uzyskać na stronie:
https://support.microsoft.com/pl-pl/kb/196652


<cyt>
    Visual Basic for Applications does not have any function that does
    arithmetic rounding.
</cyt>

Nic dodać, nic ująć.


-- -- 
BraZby
www.accdb.pl 
Re: Jak prawidłowo pomnożyc dwie liczby ??
#137075
Author: Zbigniew Bratko
Date: Tue, 08 Dec 2015 21:26
61 lines
2246 bytes

Użytkownik "Zbigniew Bratko"  napisał w wiadomości grup 
dyskusyjnych:n47g9j$lg3$1@node2.news.atman.pl...

Użytkownik "Fantom"  napisał w wiadomości grup
dyskusyjnych:n47bli$72l$1@node1.news.atman.pl...

Sprawdziłem.
Też zwraca mi 65,00 zamiast 66,00 :(
O co tu biega ??

[...]

Po prostu Access tak ma. No może nie tyle  MS Access, co VBA.
Problem znany od baaardzo dawna, a raczej od zawsze.

[...]

ale najwięcej informacji można uzyskać na stronie:
https://support.microsoft.com/pl-pl/kb/196652


<cyt>
    Visual Basic for Applications does not have any function that does
    arithmetic rounding.
</cyt>

Tak jeszcze tytułem przykładów:

Funkcja Round ()
1,015   =>   1,01
1,025   =>   1,02
1,075   =>   1,08
1,085   =>   1,08

Funkcja CByte()
0,5     =>   0
1,5     =>   2
2,5     =>   2
3,5     =>   4
4,5     =>   4

Funkcja CLng ()
0,5     =>   0
1,5     =>   2
2,5     =>   2
3,5     =>   4
4,5     =>   4

Funkcja CCur ()
0,00005 =>   0,0001
0,00015 =>   1,0002
0,00025 =>   2,0002
0,00035 =>   3,0004
0,00045 =>   4,0004


-- 
BraZby
www.accdb.pl 
Re: Jak prawidłowo pomnożyc dwie liczby ??
#137073
Author: Fantom
Date: Wed, 09 Dec 2015 08:57
13 lines
1700 bytes
>A pomnóż bez funkcji round, tylko wynik wyświetl np msgbox'ie.
>Dane które widzisz na formularzu czyli 20 i 0.33 są inne w rzeczywistości, 
>na 99% mnozysz 0.325 :)

No dokładnie tak to wygląda, że ta 0,33 jest 0,325. Ale czemu nagle tak się 
stało to nie ma pojęcia.
Funkcja ROUND tu nie ma nic do tego. Probleem jest ta druga liczba własnie. 
Jakby Round xle działało to by było np 65,99 czy cos w ty stylu. A jest 
65,00

Fantom
ps. Wziąłem w bazie skasowałem to 0,33 i wpisałem jeszcze raz 0,33 i ... 
działa. 
Re: Jak prawidłowo pomnożyc dwie liczby ??
#137076
Author: Fantom
Date: Wed, 09 Dec 2015 09:03
24 lines
1961 bytes
> Sprawdziłem.
> Też zwraca mi 65,00 zamiast 66,00 :(
> O co tu biega ??
>
> [...]
>
> Po prostu Access tak ma. No może nie tyle  MS Access, co VBA.
> Problem znany od baaardzo dawna, a raczej od zawsze.
>
> Przykładowo ze strony:
> http://www.faq.accdb.pl/14a_VbaNumbFaq.htm#vba14a_01

To nie jest problem ROUND. Wynik jest 65,00 a nie np 65,99.
Problem tymczasowo rozwiązałem poprzez skasowanie i wpisanie jeszcze raz 
0,33 - teraz liczy poprawnie. Nie ma pojęcia o co w tych chodzi. Mam starą 
kopie tego jeszcze. Może poszukam czemu te 0,33 nie jest 0,33
Trzymam to w bazie jako typ walutowy z dwoma miejscami po przecinku.

Co do samego ROUND, to dokładnie robię to tak :
ROUND (x * y + 0.000001,2)
jak do tej pory mnie nie zawiodło. A program chodzi już ... 15 lat ! Więc 
wole już tego nie ruszać

Fantom 
Re: Jak prawidłowo pomnożyc dwie liczby ??
#137077
Author: LeszekN
Date: Wed, 09 Dec 2015 10:18
14 lines
1942 bytes
 
> kopie tego jeszcze. Może poszukam czemu te 0,33 nie jest 0,33
Bo ktoś wpisał 0,325 prawdopodobnie

> Trzymam to w bazie jako typ walutowy z dwoma miejscami po przecinku.

to nie znaczy ze masz w bazie zapisane 0,33 ty widzisz 0,33 zł a tam jest np 0,325
Przetestuj to, miałem podobny problem.
Otwórz tabele w której masz to zapisane, będziesz widział 0,33 zł a jak klikniesz tą komórkę to pojawi się coś innego :) 

owocnego szukania ;)

------------
Leszek
Re: Jak prawidłowo pomnożyc dwie liczby ??
#137078
Author: Fantom
Date: Wed, 09 Dec 2015 14:48
20 lines
1959 bytes
>> kopie tego jeszcze. Może poszukam czemu te 0,33 nie jest 0,33
>Bo ktoś wpisał 0,325 prawdopodobnie

To wpisuje zewnetrzny program - niby zabezpieczone ...

>> Trzymam to w bazie jako typ walutowy z dwoma miejscami po przecinku.

>to nie znaczy ze masz w bazie zapisane 0,33 ty widzisz 0,33 zł a tam jest 
>np 0,325
>Przetestuj to, miałem podobny problem.
>Otwórz tabele w której masz to zapisane, będziesz widział 0,33 zł a jak 
>klikniesz tą komórkę to pojawi się coś innego :)

No fakt. Jak klima jest 0,325 :( Coś zewnetrzna aplikacja sie nie dogadała z 
bazą.
Zrobiłem zapytanie typu :
SELECT * FROM tabela WHERE wartosc <> ROUND(wartosc + 0.001,2)
i pokazało mi ten jeden rekord :(

Fantom 
Re: Jak prawidłowo pomnożyc dwie liczby ??
#137079
Author: Zbigniew Bratko
Date: Wed, 09 Dec 2015 21:29
47 lines
2333 bytes

Użytkownik "Fantom"  napisał w wiadomości grup
dyskusyjnych:n48qot$lb6$1@node1.news.atman.pl...

[...]

Co do samego ROUND, to dokładnie robię to tak :
ROUND (x * y + 0.000001,2)
jak do tej pory mnie nie zawiodło. A program chodzi już ... 15 lat ! Więc
wole już tego nie ruszać

[...]

Skoro chodzi i do tej pory nie zawiodła, to OK.

Tak tylko hipotetycznie:

Może kiedyś w oparciu o tą metodę zaokrąglania zrobisz jakieś totalne 
podsumowanie z zakresu dużych licz, lub jakieś inne  "Astronomiczne" 
obliczenie i dla przykładowych wartości:

Dim x As Double
Dim y As Currency

x = 100002.25
y = 1000000.02

Debug.Print x * y
Debug.Print Round(x * y + 0.000001, 2)
Debug.Print Round(x * y, 2)
Debug.Print bs_Round(x * y, 2)

otrzymasz:
100002252000,045     ' wynik bez zaokrąglenia
-
100002252000,04       ' Twoje zaokrąglenie
100002252000,04       ' funkcja Round
100002252000,05       ' funkcja bs_Round

Co prawda, to tylko 0,01 różnicy i nijak się nie ma do całkowitej wartości 
100 miliardów,  no nie mniej jednak może być leciutki obciach ;-)

-- 
Pozdrowienia
BraZby
www.accdb.pl
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads