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 ??
Author: Fantom
Date: Tue, 08 Dec 2015 13:13
Date: Tue, 08 Dec 2015 13:13
16 lines
1407 bytes
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 ??
Author: LeszekN
Date: Tue, 08 Dec 2015 13:39
Date: Tue, 08 Dec 2015 13:39
15 lines
1558 bytes
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 ??
Author: tomasz.szczuko
Date: Tue, 08 Dec 2015 19:37
Date: Tue, 08 Dec 2015 19:37
16 lines
1731 bytes
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 ??
Author: Fantom
Date: Tue, 08 Dec 2015 19:39
Date: Tue, 08 Dec 2015 19:39
24 lines
1581 bytes
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 ??
Author: LeszekN
Date: Tue, 08 Dec 2015 20:53
Date: Tue, 08 Dec 2015 20:53
5 lines
1663 bytes
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 ??
Author: Zbigniew Bratko
Date: Tue, 08 Dec 2015 20:58
Date: Tue, 08 Dec 2015 20:58
40 lines
2038 bytes
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 ??
Author: Zbigniew Bratko
Date: Tue, 08 Dec 2015 21:26
Date: Tue, 08 Dec 2015 21:26
61 lines
2246 bytes
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 ??
Author: Fantom
Date: Wed, 09 Dec 2015 08:57
Date: Wed, 09 Dec 2015 08:57
13 lines
1700 bytes
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 ??
Author: Fantom
Date: Wed, 09 Dec 2015 09:03
Date: Wed, 09 Dec 2015 09:03
24 lines
1961 bytes
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 ??
Author: LeszekN
Date: Wed, 09 Dec 2015 10:18
Date: Wed, 09 Dec 2015 10:18
14 lines
1942 bytes
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 ??
Author: Fantom
Date: Wed, 09 Dec 2015 14:48
Date: Wed, 09 Dec 2015 14:48
20 lines
1959 bytes
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 ??
Author: Zbigniew Bratko
Date: Wed, 09 Dec 2015 21:29
Date: Wed, 09 Dec 2015 21:29
47 lines
2333 bytes
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