Olen tehnyt ohjelman, joka muuttaa tietyn luvun päiviksi.
Nyt ongelmana on se, että jos tämä luku ylittää 20 päivän, niin luku on niin suuri, että käyttämäni muuttuja Long aiheuttaa sen, että kun käännän sen päiviksi, niin päivät ovatkin miinusmerkkisiä
Esim. Oikea luku laskettuna päiviksi osoittaa 28 päivää, kun oma ohjelmani näyttää sen -20 päivää.
Luku on tällöin n. 2419200 (sekuntteja)
Käytännössä luku voi kasvaa niin suureksi, että päiviksi muutettuna se voi ylittää yli 300 pävää, joten mitä muuttujaa tuossa pitäisi käyttää jotta se ei aiheuta tuota ongelmaa?
En aivan käsittänyt, mikä tässä oli ongelmana, mutta tarkoititko siis, että Longin lukualue on liian pieni? Että luvut, joita käytät ylittävät neljä miljardia? Kokeilepa käyttää Doublea, se on kaksi kertaa niin suuri kuin Long, mutten oikein usko, että se voisi ratkaista tämän ongelman.
Edit: Millä tavalla siis muutat tuon sekuntimäärän päiviksi, ja takaisin? Yksinkertaisesti kertomallako?
Vika mahdollisesti muunnos koodissa? Laita koodi näkymään..
Vika on kyllä jossain muualla, kuin tuossa tietotyypin valinnassa. Longin lukualue on ~-2*10^9 - 2*10^9 ja tuo 300 päivääkin on sekunteina "vain" ~26*10^6
Function Konversio(ByVal a As Double) As Double a = a / 60 'minuuteiksi a = a / 60 'tunneiksi a = a / 24 'päiviksi Konversio = a End Function
Tekaisin tällaisen funktion, joka palauttaa parametrina saadut sekunnit päivinä. Itse en havainnut mitään ongelmaa muunnoksessa.
paivat = CLng(koa) \ 86400 koa = CLng(koa) - paivat * 86400 tunnit = CLng(koa) \ 3600 koa = koa - tunnit * 3600 minuutit = CLng(koa) \ 60 koa = CLng(koa) - minuutit * 60 sekunnit = koa
Ja tuo muuttuja koa on longina. Doublella ko systeemi ei edes toimi.
Sen verran pitää korjata, että alkujaan koa on millisekuntteina (en saa sitä muulla ulos) jonka jaan ennen tuota koodia tuhannella saaden sekunneiksi sen.
Laitoin muunnoksen koodiin, että hakiessaan millisekunteina muuttujaan, niin sitä ennen teen tuon jaon, jolloin "ilmeisesti" pääsin tuosta ongelmasta pois jos päivät ei ylitä yli 300 päivää.
Ongelma on periaatteessa siinä, että valmis funktio määrittää millisekunnit suoraan longiksi, jossa koodissa pitäisi tehdä tyyppimuutos. Doubleksi muuttaminen ei siis ilmeisesti onnistu, koska jos sitä käytän, niin koko ohjelma ei toimi. Ainoa oikeastaan millä se toimii on long. Varianttia en ole koittanut. String on taas liian "raskas" joka myös liian suurella luvulla aiheuttaa ongelmia.
Tuo kenoviiva on väärinpäin; jakomerkki on / eikä \
ja millisekunteja mahtuu etumerkittömään longiin 49,7 päivää tai etumerkilliseen 24,9 päivää
Metabolix kirjoitti:
Tuo kenoviiva on väärinpäin; jakomerkki on / eikä \
VB:ssä toimii molemmat. / palauttaa floatin ja \ kokonaisluvun.
Metabolix kirjoitti:
ja millisekunteja mahtuu etumerkittömään longiin 49,7 päivää tai etumerkilliseen 24,9 päivää
Mitä tarkoitat tuolla etumerkillisellä ja etumerkittömällä?
Etumerkillisen muuttujan arvoalue on:
-n - n
Etumerkittömän muuttujan arvoalue:
0 - 2n
Eli siis etumerkittömään muuttujaan ei saa negatiivisia lukuja.
Edit: Mutta siis, ei kai tuolla Basicissa juuri ole merkitystä?
VB:ssä käsittääkseni ei noita etumerkittömiä tietotyyppejä ole.
Aihe on jo aika vanha, joten et voi enää vastata siihen.