BTC/PLN jak zapisujecie dane
- Początkujący
- Posty: 15
- Rejestracja: 23 maja 2015
- Reputacja: 0
BTC/PLN jak zapisujecie dane
Postautor: 1911pablo » niedziela, 24 maja 2015, 13:19
W jakim formacie utrzymujecie walute BTC w swoich bazach a w jakim PLN ?
int64 dla BTC a jak PLN ?
Z wiadomego powodu nie pracujemy z double/float - co wybraliście u siebie?
1911pablo
- Początkujący
- Posty: 15
- Rejestracja: 23 maja 2015
- Reputacja: 0
Re: BTC/PLN jak zapisujecie dane
Postautor: 1911pablo » poniedziałek, 25 maja 2015, 10:26
No cóż,
u siebie:
BTC trzymam w SATOSHI ( BIGINT )
PLN trzymam w GROSZACH (BIGINT (tu można by zjechać niżej, ale nie widzę na razie z tym problemów ))
w kodzie uint64_t dla satoshi/grosze
Ktoś mnie gdzieś priv pytał o kod
Kod: Zaznacz cały
// Convert BITCOIN to SATOSHIs
static uint64_t BTC2SATOSHI(const double& value)
{
return static_cast<uint64_t>((value * 1e8 + (value < 0.0 ? -.5 : .5)));
}
// Convert SATOSHIS to BITCOIN
static double SATOSHI2BTC(const uint64_t& value)
{
return static_cast<double>((value/1e8));
}
// Convert GROSZE to PLN
static double GROSZE2PLN(const uint64_t& value)
{
return static_cast<double>((value/100));
}
// Convert PLN to GROSZE
static uint64_t PLNtoGROSZE(const double& value)
{
return static_cast<uint64_t>((value * 100));
}
1911pablo
- Dyskutant
- Posty: 165
- Rejestracja: 25 lutego 2012
- Reputacja: 0
Re: BTC/PLN jak zapisujecie dane
Postautor: quakociaptockh » poniedziałek, 25 maja 2015, 10:52
quakociaptockh
- Początkujący
- Posty: 15
- Rejestracja: 23 maja 2015
- Reputacja: 0
Re: BTC/PLN jak zapisujecie dane
Postautor: 1911pablo » poniedziałek, 25 maja 2015, 15:21
1. Nie moge Ci odpisac PRV (nie mam tam nawet opcji 'odpisz')
2. Zapis podany przeze mnie powyzej zda calkowicie egzamin - czyz nie?
Ex.
Liczba Satoshi w portfelu:
Liczba Groszy w portfelu:<MESSAGE,PORTFOLIO,1432560113,0,100000000>
Kwestia prezentacji tego w stylu user's friendly, to juz inna bajka - pisalem o wewnatrz systemowej interpretacji.<MESSAGE,PORTFOLIO,1432560103,1500,0>
Złożenie orderu
<LIMITORDER, 0.5BTC, 100PLN, 2SELL>
<lo,0.5,100,2>
<MESSAGE,NEWORDER,1432560262,2>
<MESSAGE,YOURORDERS,1432560264,2,50000000,10000,1,2>
1911pablo
- Zawsze mam rację
- Posty: 6923
- Rejestracja: 15 lutego 2011
- Reputacja: 4513
- Lokalizacja: Zmienna
Re: BTC/PLN jak zapisujecie dane
Postautor: ShadowOfHarbringer » poniedziałek, 25 maja 2015, 15:39
- W bazie Mariadb/MySQL ciągi były zapisane w formacie DECIMAL
- Na liczbach operowałem za pomocą specjalnych funkcji do kalkulacji liczb o dowolnej precyzji (w php BCMath)
- Przy obliczeniach operowałem naturalnie na STRINGach, używanie typów zmiennoprzecinkowych FLOAT/DOUBLE itp jest w finansach surowo zabronione i niebezpieczne, bo takie typy gubią precyzję
- Dla Bitcoinów precyzja wynosiła 16 lub 20 miejsc po przecinku, dla złotówek 4 miejsca po przecinku
- Przy obliczeniach zdaje się że stosowałem dokładność 32 miejsc po przecinku, po czym zaokrąglałem
Oczywiście mój silnik miał mocno przesadzone parametry, zwykle precyzja zmiennoprzecinkowa do 4 miejsc po przecinku dla walut (czyli grosze + 2 miejsca) i 12 miejsc po przecinku dla BTC (czyli do satoshi + 4 miejsca) powinna w zupełności wystarczyć aby nikt nie czuł się pokrzywdzony.
Oczywiście użytkownicy nie widzą pełnej precyzji tylko zaokrągloną, ale obliczenia pod spodem muszą odbywać w odpowiednio większej precyzji, w przeciwnym wypadku prowadzi to do problemów.
Ocenzurowane i zmanipulowane fora: /r/Bitcoin, /r/CryptoCurrency, BitcoinTalk
ShadowOfHarbringer
- Początkujący
- Posty: 15
- Rejestracja: 23 maja 2015
- Reputacja: 0
Re: BTC/PLN jak zapisujecie dane
Postautor: 1911pablo » poniedziałek, 25 maja 2015, 19:37
nie do konca rozumiem dlaczego dla satoshi masz 12 miejsc po przecinku / dla grosza +2 ?
Przeciez skoro wszystko lecisz w int'ach (operacje dodawania/...) a ostatecznie przedstawiasz wartosci;
btc 0.00000000
pln 0.00
gdzie te dodatkowe miejsca byly ci potrzebne?
1911pablo
- Weteran
- Posty: 3966
- Rejestracja: 15 lutego 2014
- Reputacja: 428
Re: BTC/PLN jak zapisujecie dane
Postautor: Chancellor » poniedziałek, 25 maja 2015, 19:48
Jeżeli masz zakup sumy w BTC z 8 miejscami po przecinku po kursie w PLN wyrażonym z dokładnością do 2 miejsc po przecinku, to już masz 10 miejsc po przecinku...1911pablo pisze:Przeciez skoro wszystko lecisz w int'ach (operacje dodawania/...)
Chancellor
- Początkujący
- Posty: 15
- Rejestracja: 23 maja 2015
- Reputacja: 0
Re: BTC/PLN jak zapisujecie dane
Postautor: 1911pablo » poniedziałek, 25 maja 2015, 22:56
1) Wszystkie operacje na BTC i PLN dokonywane są na uint64_t (0-18446744073709551615)
gdzie BTC sa liczone jako SATOSHI a PLN jako GROSZE. Czyli skladajac order podajesz liczbe całkowitą w satoshi / groszach.
W bazie trzymam je jako BIGINT(20)
2) Jedyne miejsce w którym widzisz to w postaci liczby po przecinku to end-user-interface w którym :
Zamieniasz ilość SATOSHI ze swojego portfela na BTC via:
Kod: Zaznacz cały
return static_cast<double>((value/1e8));
Kod: Zaznacz cały
return static_cast<double>((value/100));
Pytanie czy wygodne jest podawanie przy orderach satoshi/groszy - to inna kwestia ( na systemie tradeują głównie automaty ).
1911pablo
- Weteran
- Posty: 3966
- Rejestracja: 15 lutego 2014
- Reputacja: 428
Re: BTC/PLN jak zapisujecie dane
Postautor: Chancellor » wtorek, 26 maja 2015, 06:25
A to jest dopiero początek kłopotów. Dorzućmy do tego wyliczanie prowizji dla giełdy, albo – nie daj Boże – handel z dźwignią i liczenie opłat...
Chancellor
- Zawsze mam rację
- Posty: 6923
- Rejestracja: 15 lutego 2011
- Reputacja: 4513
- Lokalizacja: Zmienna
Re: BTC/PLN jak zapisujecie dane
Postautor: ShadowOfHarbringer » wtorek, 26 maja 2015, 17:02
Dlatego właśnie zawsze lepiej sobie dodać kilka ekstra miejsc po przecinku, aby nie zaokrąglać w ogóle.Chancellor pisze:To ja też jeszcze raz. Mam na koncie 200 PLN = 20000 groszy. Kupuję 0,12345678 BTC (12345678 satoshi) po 876,54 PLN (87654 grosze). W związku z tym z konta trzeba mi zdjąć – licząc w groszach i satoshi – 12345678 * 87654 / 100000000 = 10821,48059412 groszy. I teraz co robisz, albo zaokrąglasz na korzyść mnie, ucinając część ułamkową, albo zaokrąglasz na korzyść giełdy, odliczając z salda złotówkowego 10822 grosze. Jeżeli już pisałbym w ten sposób, to musiałbym uważnie pamiętać o tym, żeby każdą operację zaokrąglać finalnie na korzyść giełdy.
A to jest dopiero początek kłopotów. Dorzućmy do tego wyliczanie prowizji dla giełdy, albo – nie daj Boże – handel z dźwignią i liczenie opłat...
Jeżeli są co najmniej o 2 miejsca po przecinku za dużo, to operacje takie jak mnożenie, dzielenie, pierwiastkowanie i inne złożone działania nie powodują powstania _żadnego_, nawet minimalnego błędu na rachunkach userów.
Ocenzurowane i zmanipulowane fora: /r/Bitcoin, /r/CryptoCurrency, BitcoinTalk
ShadowOfHarbringer
- Bardzo Zły Moderator
- Posty: 14380
- Rejestracja: 16 kwietnia 2012
- Reputacja: 2659
- Lokalizacja: Polska/Wwa/GW
Re: BTC/PLN jak zapisujecie dane
Postautor: rav3n_pl » wtorek, 26 maja 2015, 19:29
BIP39 Mnemonic z talii kart
Bitcoin Core 0.26.1
Linki do YT, TT, LI i reszty
rav3n_pl
- Weteran
- Posty: 1415
- Rejestracja: 26 sierpnia 2011
- Reputacja: 88
Re: BTC/PLN jak zapisujecie dane
Postautor: grzem » wtorek, 26 maja 2015, 21:16
grzem
- Weteran
- Posty: 3439
- Rejestracja: 4 sierpnia 2011
- Reputacja: 479
- Napiwki: 1AqwNEzAp5GE46jebmZYqvq3tXt19iChJN
Re: BTC/PLN jak zapisujecie dane
Postautor: powered » wtorek, 26 maja 2015, 23:02
No ale jeżeli z góry określimy dokładną precyzję liczby zmiennoprzecinkowej:
w mysql np: decimal(20,12) to żadnych problemów nie będzie pod warunkiem że nie będą zapisywane jakieś ogromne kwoty. Bitcoinów jest 21 milionów więc się zmieszczą wszystkie
powered
- Zawsze mam rację
- Posty: 6923
- Rejestracja: 15 lutego 2011
- Reputacja: 4513
- Lokalizacja: Zmienna
Re: BTC/PLN jak zapisujecie dane
Postautor: ShadowOfHarbringer » środa, 27 maja 2015, 08:27
Zgadza się, ale drobna korekta: typ DECIMAL w bazie danych to nie jest zwykła liczba zmiennoprzecinkowa "FLOAT". To są kompletnie dwie różne rzeczy.powered pisze:Z double i float mogą wyjść różne kwiatki.
No ale jeżeli z góry określimy dokładną precyzję liczby zmiennoprzecinkowej:
w mysql np: decimal(20,12) to żadnych problemów nie będzie pod warunkiem że nie będą zapisywane jakieś ogromne kwoty. Bitcoinów jest 21 milionów więc się zmieszczą wszystkie
FLOAT gubi dokładność, DECIMAL nie. DECIMAL został stworzony właśnie po to, aby można było przechowywać liczby nie gubiąc żadnej precyzji.
Alternatywnie można też po prostu zapisywać liczby w stringach (w bazie: CHAR, BINARY), ale będzie to wolniejsze od DECIMAL. Celowo pominąłem VARCHARa/VARBINARY, bo są do dupy i nigdzie tego nie używam.
Ocenzurowane i zmanipulowane fora: /r/Bitcoin, /r/CryptoCurrency, BitcoinTalk
ShadowOfHarbringer
- Weteran
- Posty: 1415
- Rejestracja: 26 sierpnia 2011
- Reputacja: 88
Re: BTC/PLN jak zapisujecie dane
Postautor: grzem » środa, 27 maja 2015, 09:57
Klient wystawił zlecenie sprzedaży 1 BTC po 1000 PLN.
Zostało zrealizowane w trzech transakcjach:
30000400 sat
30000400 sat
39999200 sat
Jak ten problem rozwiąże decimal?
Co zobaczy klient (jakie trzy transakcje i jaką sumę) na wyciągu?
grzem
- Zawsze mam rację
- Posty: 6923
- Rejestracja: 15 lutego 2011
- Reputacja: 4513
- Lokalizacja: Zmienna
Re: BTC/PLN jak zapisujecie dane
Postautor: ShadowOfHarbringer » środa, 27 maja 2015, 13:52
To do mnie pytanie ? Jeżeli tak, to nie rozumiem pytania. Odpowiem inaczej:grzem pisze:To ja może prościej, na przykładzie:
Klient wystawił zlecenie sprzedaży 1 BTC po 1000 PLN.
Zostało zrealizowane w trzech transakcjach:
30000400 sat
30000400 sat
39999200 sat
Jak ten problem rozwiąże decimal?
Co zobaczy klient (jakie trzy transakcje i jaką sumę) na wyciągu?
W decimalu możesz zapisać te 3 liczby jako
0,30000400 BTC
0,30000400 BTC
0,39999200 BTC
Pełna precyzja będzie zachowana. DECIMAL to tylko sposób zapisu liczb w bazie danych MariaDB/MySQL. Na pewno mówimy o tym samym ?
Ocenzurowane i zmanipulowane fora: /r/Bitcoin, /r/CryptoCurrency, BitcoinTalk
ShadowOfHarbringer
- Weteran
- Posty: 1415
- Rejestracja: 26 sierpnia 2011
- Reputacja: 88
Re: BTC/PLN jak zapisujecie dane
Postautor: grzem » środa, 27 maja 2015, 14:14
Klient widzi trzy transakcje i saldo po operacji, jakie?
grzem
- Zawsze mam rację
- Posty: 6923
- Rejestracja: 15 lutego 2011
- Reputacja: 4513
- Lokalizacja: Zmienna
Re: BTC/PLN jak zapisujecie dane
Postautor: ShadowOfHarbringer » środa, 27 maja 2015, 14:52
grzem pisze:Odpowiedz zatem na drugie pytanie jeśli nie widzisz problemu.
Klient widzi trzy transakcje i saldo po operacji, jakie?
Kod: Zaznacz cały
<?php
$liczba1 = '0.30000400';
$liczba2 = '0.30000400';
$liczba3 = '0.39999200';
$wynik1 = bcadd($liczba1, $liczba2, 12);
$wynik2 = bcadd($wynik1, $liczba3, 12);
var_dump($wynik2);
string(14) "1.000000000000"
Wracając do DECIMALA, w MariaDB musisz utworzyć pole DECIMAL o precyzji 12-znakowej, zdaje się, że to będzie DECIMAL(22,12), gdzie 22 - całkowita liczba znaków, 12 - liczba znaków po przecinku.
Ocenzurowane i zmanipulowane fora: /r/Bitcoin, /r/CryptoCurrency, BitcoinTalk
ShadowOfHarbringer
- Weteran
- Posty: 1415
- Rejestracja: 26 sierpnia 2011
- Reputacja: 88
Re: BTC/PLN jak zapisujecie dane
Postautor: grzem » środa, 27 maja 2015, 14:59
Klient raczej nie potrzebuje oglądać 12 miejsc, skoro realnie istnieje 8.
grzem
- Zawsze mam rację
- Posty: 6923
- Rejestracja: 15 lutego 2011
- Reputacja: 4513
- Lokalizacja: Zmienna
Re: BTC/PLN jak zapisujecie dane
Postautor: ShadowOfHarbringer » środa, 27 maja 2015, 15:48
Jakie PLN, ja Ci podaję wynik w BTC.grzem pisze:Powinno być około 1000 PLN z trzech transakcji.
Chciałeś realny wynik, a nie to co pokazujemy klientowi.grzem pisze:Klient raczej nie potrzebuje oglądać 12 miejsc, skoro realnie istnieje 8.
Wynik jest w pełnej precyzji, a klientowi pokazujemy zaokrąglone.
Ocenzurowane i zmanipulowane fora: /r/Bitcoin, /r/CryptoCurrency, BitcoinTalk
ShadowOfHarbringer
Wróć do „Programowanie i wdrożenia”
- Bitcoin
- Bezpieczeństwo
- Giełdy i serwisy - zagrożenia
- Anonimowość i bezpieczeństwo w sieci
- Piramidy i scamy
- Bitcoin
- Rozwój projektu
- Twój wkład w rozwój projektu
- Przedszkole
- Pomoc techniczna
- Generowanie monet
- Pomoc
- Ogólnie o miningu
- Mining pools
- Kopacze (miners)
- Sprzęt (hardware) do miningu
- Bitcoin w mediach
- Projekty związane z Bitcoin
- Imprezy, spotkania, konferencje
- Kwestie prawne
- Ciekawostki
- Organizacje charytatywne, zbiórki, dotacje
- Programowanie i wdrożenia
- Ankiety
- Portfele bitcoin
- Dla zaawansowanych - nowi tylko czytają
- Ekonomia
- Rozważania ekonomiczne
- Ankiety ekonomiczne
- Analiza techniczna
- Tutaj zapłacisz bitcoinami
- Polska
- Świat
- Tablica ogłoszeń
- Towary
- Sprzedam
- Kupię
- Zamienię
- Udziały
- Usługi
- Wymiana walut
- Komentarze
- Nagrody
- Wymiana Face-to-Face
- Dolnośląskie
- Kujawsko-pomorskie
- Lubelskie
- Lubuskie
- Łódzkie
- Małopolskie
- Mazowieckie
- Opolskie
- Podkarpackie
- Podlaskie
- Pomorskie
- Śląskie
- Świętokrzyskie
- Warmińsko-mazurskie
- Wielkopolskie
- Zachodniopomorskie
- Cała Polska
- Szukam/dam pracę
- Boty i strategie
- Giełdy, kantory, bitomaty
- Kantory
- Bitomaty
- Inwestycje
- Metale szlachetne
- ICO
- Forki i Alternatywne kryptowaluty
- LiteCoin
- Ekonomia
- Mining
- Ustawienia i konfiguracje
- Linki
- Dogecoin
- Ekonomia
- Mining
- NameCoin
- Ekonomia
- Mining
- Pozostałe
- Scrypt
- SHA256
- Dash
- Ethereum
- ETC
- Lisk
- Bitcoin Cash
- Kopanie kryptowalut
- Kopanie GPU
- Kopanie CPU
- Kopanie ASIC/FPGA
- Kopalnie kryptowalut
- IOTA
- NEO
- Chia
- SCAMY
- Inne
- Linki
- Faucety, kraniki, gry
- Księga skarg i zażaleń
- AMA
- Strona i forum
- Administrator mówi
- Opinie, propozycje, uwagi
- Propozycje banów
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 12 gości
- Strefa czasowa UTC+02:00
- Na górę
- Zmień szerokość ekranu
- Usuń ciasteczka witryny
O Polskim Forum Bitcoin
Polskie Forum Bitcoin skupia miłośników Bitcoina w Polsce. Tu możesz zadać pytania odnośnie Bitoina lub podyskutować na ciekawe tematy.
Polecamy
Treści na tym forum mają charakter wyłącznie informacyjno-edukacyjny, a posty są wyrazem osobistych poglądów ich autorów. Treśći na forum ani w całości ani w części nie stanowią "rekomendacji" w rozumieniu przepisów Rozporządzenia Ministra Finansów z dnia 19 października 2005 r. w sprawie informacji stanowiących rekomendacje dotyczące instrumentów finansowych, lub ich emitentów (Dz.U. z 2005 r. Nr 206, poz. 1715).