Autor Téma: Pretečenie celého čísla  (Přečteno 209 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4992
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Pretečenie celého čísla
« kdy: 17-06-2020, 19:10:30 »

Citace
execution caused by system error that does not preclude successful execution of subsequent statements.
Integer overflow.  The result of an integer operation caused the most significant bit of the result to carry.
Kód: [Vybrat]
DECIMAL(16, 5)  DECIMAL(18, 5)    DECIMAL(15, 4)
IIT.NUMBER *    IIT.PRICEUNIT * VR.RATE_COEFFICIENT
Najvyšší výsledok je 30 000. Zjavne som čosi nepochopil. Prosím o vysvetlenie.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4992
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Pretečenie celého čísla
« Odpověď #1 kdy: 17-06-2020, 19:41:55 »
Ak pretypujem PRICEUNIT na DECIMAL(16, 5), tak to ide.
Kde si o tom môžem prečítať? Kľúčové slová...
Mám tam chybu. PRICEUNIT je DECIMAL(18, 6)
.
Jediné čo som zistil, že mu vadí počet desatinných miest 6.
« Poslední změna: 17-06-2020, 19:49:35 od Stanislav Hruška »
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Jirka

  • Plnoletý
  • ***
  • Příspěvků: 236
  • Karma: 9
    • Verze Delphi: XE2
Re:Pretečenie celého čísla
« Odpověď #2 kdy: 17-06-2020, 20:09:03 »

Citace
execution caused by system error that does not preclude successful execution of subsequent statements.
Integer overflow.  The result of an integer operation caused the most significant bit of the result to carry.
Kód: [Vybrat]
DECIMAL(16, 5)  DECIMAL(18, 5)    DECIMAL(15, 4)
IIT.NUMBER *    IIT.PRICEUNIT * VR.RATE_COEFFICIENT
Najvyšší výsledok je 30 000. Zjavne som čosi nepochopil. Prosím o vysvetlenie.
Můzes sem poslat celou definici kde se problem vyskytuje ?

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4992
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Pretečenie celého čísla
« Odpověď #3 kdy: 17-06-2020, 20:22:26 »
Tu ide len o výsledok toho násobenia. Tú definíciu Decimal(18, 6) mám preto, že vo faktúrach od elektrárni je JC na 6 desatinných miest. Chcel som to dodržať. Mám to v časti WHERE. Myslím si, že keď to prevediem napr. na DECIMAL(16, 5) tak budem mať dostatočnú presnosť. Presný výraz je
Kód: [Vybrat]
((IIT.NUMBER * IIT.PRICEUNIT * VR.RATE_COEFFICIENT + (IIT.CENTSETTLEMENT - IIT.PRICETOTAL)) <> 0)Je to dodatočná kontrola faktúr. Len tak pre istotu. Dosť ma zarazilo, že ak som použil napríklad pri pretypovaní Decimal(10,6), tak to opäť pretieklo. Ale ako som dal DECIMAL(18, 5) je to OK.
Ja to chápem tak, že Decimal(10,6) je rozsahom podstatne menší ako DECIMAL(18, 5).
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4992
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Pretečenie celého čísla
« Odpověď #4 kdy: 17-06-2020, 20:27:19 »
Neviem či sa niekde niečo zmenilo, ale doteraz mi to fungovalo. FB som medzitým povýšil z 3.0.4.33054_0 na 3.0.5.33220_0.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline PetrB0

  • Mladík
  • **
  • Příspěvků: 61
  • Karma: 1
    • Verze Delphi: Delphi XE2, Delphi 10.2 Tokyo
Re:Pretečenie celého čísla
« Odpověď #5 kdy: 17-06-2020, 22:48:44 »
Ahoj,
nevím to jistě, ale neznamená zápis 10:6 deset platných číslic a z toho 6 desetinných? Takže max 9999.999999
No a 18:6 by bylo 999 999 999 999.999999?

Pb

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2790
  • Karma: 134
    • Verze Delphi: D2007, XE3, DX10
Re:Pretečenie celého čísla
« Odpověď #6 kdy: 18-06-2020, 07:00:16 »
Tu ide len o výsledok toho násobenia. Tú definíciu Decimal(18, 6) mám preto, že vo faktúrach od elektrárni je JC na 6 desatinných miest. Chcel som to dodržať. Mám to v časti WHERE. Myslím si, že keď to prevediem napr. na DECIMAL(16, 5) tak budem mať dostatočnú presnosť. Presný výraz je
Kód: [Vybrat]
((IIT.NUMBER * IIT.PRICEUNIT * VR.RATE_COEFFICIENT + (IIT.CENTSETTLEMENT - IIT.PRICETOTAL)) <> 0)Je to dodatočná kontrola faktúr. Len tak pre istotu. Dosť ma zarazilo, že ak som použil napríklad pri pretypovaní Decimal(10,6), tak to opäť pretieklo. Ale ako som dal DECIMAL(18, 5) je to OK.
Ja to chápem tak, že Decimal(10,6) je rozsahom podstatne menší ako DECIMAL(18, 5).
Kontrolni otazka: jaky pouzivas dialekt? (https://firebirdsql.org/file/documentation/pdf/en/refdocs/fblangref25/firebird-25-language-reference.pdf) kapitola 3.3

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4992
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Pretečenie celého čísla
« Odpověď #7 kdy: 18-06-2020, 07:38:08 »
Citace
Ahoj,nevím to jistě, ale neznamená zápis 10:6 deset platných číslic a z toho 6 desetinných? Takže max 9999.999999No a 18:6 by bylo 999 999 999 999.999999?
To nesedí. Prejde mi 18,5 ale neprejde 10,6
Dialekt 3. FB ver. 3.0.5
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2790
  • Karma: 134
    • Verze Delphi: D2007, XE3, DX10
Re:Pretečenie celého čísla
« Odpověď #8 kdy: 18-06-2020, 09:10:37 »
Citace
Ahoj,nevím to jistě, ale neznamená zápis 10:6 deset platných číslic a z toho 6 desetinných? Takže max 9999.999999No a 18:6 by bylo 999 999 999 999.999999?
To nesedí. Prejde mi 18,5 ale neprejde 10,6
Jak je napsano vyse: celkove mas 10 cislic, z to 6 za desetinnou carkou, takze max. hodnota je 9999.999999 a tys psal, ze mas 30000

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2790
  • Karma: 134
    • Verze Delphi: D2007, XE3, DX10
Re:Pretečenie celého čísla
« Odpověď #9 kdy: 18-06-2020, 09:54:21 »
Ak pretypujem PRICEUNIT na DECIMAL(16, 5), tak to ide.
Kde si o tom môžem prečítať? Kľúčové slová...
Mám tam chybu. PRICEUNIT je DECIMAL(18, 6)
Zalezi, jake jsou ty hodnoty a s jakym typem to interne pocita , kdyz se jednotlive presnosti lisi (to nevim), protoze se muze pri a * b * c stat, ze a * b vytece z rozsahu, ale *c < 1 to do rozsahu zase vrati, takze pomuze treba zmena poradi, ale treba zase za cenu ztraty presnosti - zalezi na rozptylu hodnot.

Obecne asi neni dobre nechavat to na implicitnich konverzich, ale kdyz uz bych musel pracovat s rozdilnymi presnostmi, tak bych to explicitne pretypovanim  sjednotil.

Citace
Jediné čo som zistil, že mu vadí počet desatinných miest 6.
A to vis, nebo si to myslis? kdyz zkusis typecast 16,6, misto 16,5, tak co se stane?

Offline Jirka

  • Plnoletý
  • ***
  • Příspěvků: 236
  • Karma: 9
    • Verze Delphi: XE2
Re:Pretečenie celého čísla
« Odpověď #10 kdy: 18-06-2020, 10:01:25 »

Citace
execution caused by system error that does not preclude successful execution of subsequent statements.
Integer overflow.  The result of an integer operation caused the most significant bit of the result to carry.
Kód: [Vybrat]
DECIMAL(16, 5)  DECIMAL(18, 5)    DECIMAL(15, 4)
IIT.NUMBER *    IIT.PRICEUNIT * VR.RATE_COEFFICIENT
Najvyšší výsledok je 30 000. Zjavne som čosi nepochopil. Prosím o vysvetlenie.
IMHO asi takto -
pokud pronásobíš tyto tři hodnoty bude  výsledek obsahovat 14 desetiných míst tudíž ti na ostatní zbude  max 4 pozice, proto může docházet k přetečení a tomuto chybovému hlášení . Nejrychleji  to lze eliminovat přetypováním hodnot(y)

Ještě přidávám testovací příklad 
Kód: [Vybrat]
SELECT  (10.25125*10.81133*10.1151) FROM RDB$DATABASEzkus tam přičíst do nějake hodnoty třeba 100 a uvidíš co to udělá


« Poslední změna: 18-06-2020, 10:08:11 od Jirka »

Offline Jirka

  • Plnoletý
  • ***
  • Příspěvků: 236
  • Karma: 9
    • Verze Delphi: XE2
Re:Pretečenie celého čísla
« Odpověď #11 kdy: 18-06-2020, 11:16:01 »
Tady jsem našel něco k dané problematice
http://www.firebirdfaq.org/faq207/

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4992
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Pretečenie celého čísla
« Odpověď #12 kdy: 18-06-2020, 11:54:38 »
Ďakujem. V odkaze od Jirku to je pekne vysvetlené.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.