Toon posts:

[VB.NET] Decimal Data Type

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik wil een variable defineren die tot maximaal 5 cijfers als decimaal moet aankunnen en een aantal cijfers als standaard getal (zeker 6). Volgens msdn is Decimal het enige data type dat gedefineerd kan worden met cijfers als decimalen. De beperking van een Decimal is echter dat als je voor een waarde kiest met decimalen, deze een maximale waarde heeft van 7.9. Dat is te weinig voor mijn toepassing. Indien ik een Decimal variable een getal assign die niet binnen deze range valt, neemt de variable het getal wel over maar verliest het de punt. Ik neem aan dat de Decimal variable in dat geval de andere van de twee mogelijke ranges aanneemt: 0 through +/-79,228,162,514,264,337,593,543,950,335 (+/-7.9...E+28) † with no decimal point. Het is de bedoeling dat de variable in een later stadium naar een Microsoft SQL database wordt geschreven. Welk data type kan ik het beste gebruiken voor mijn toepassing?

In het algemeen snap ik niet zo goed wat het voordeel is van een Decimal die bovenstaande range gebruikt ten opzichte van een Single. Het enige wat ik kan verzinnen is dat een Single geen 0 kan bevatten. Is dit de belangrijkste reden?

http://msdn2.microsoft.com/en-us/library/47zceaw7.aspx

Nog een andere vraag: Is het good practice bij een offline SQL database applicatie om de SQL connection open te houden tijdens het programma? Waar kan ik de SQL connection het beste aanmaken als het scope moet hebben in alle classes (ook eigen gemaakt) en forms?

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Uit mijn lokale MSDN:
The decimal type is stored as a 12-byte integral part, a 1-bit sign, and a scaling factor.

The decimal type can accurately represent very large or very precise decimal numbers. Numbers as large as 101028 (positive or negative) and with as many as 28 significant digits can be stored as a decimal type without loss of precision. This type is useful for applications (such as accounting) where rounding errors must be avoided.


Een decimal kan dus 28 decimalen zonder precisieverlies opslaan (lees: 28 cijfers achter elkaar, met ofwel ergens een "punt" tussen de getallen, ofwel een berg nullen erachteraan).

Een Single (cq. float) kan dit niet - deze heeft bijna altijd precisieverlies omdat een gebroken getal 9 van de 10 keer niet exact in een float-representatie kan worden uitgedrukt.

Verwijderd

Topicstarter
MrBucket schreef op woensdag 11 april 2007 @ 21:42:
Uit mijn lokale MSDN:
The decimal type is stored as a 12-byte integral part, a 1-bit sign, and a scaling factor.

The decimal type can accurately represent very large or very precise decimal numbers. Numbers as large as 101028 (positive or negative) and with as many as 28 significant digits can be stored as a decimal type without loss of precision. This type is useful for applications (such as accounting) where rounding errors must be avoided.


Een decimal kan dus 28 decimalen zonder precisieverlies opslaan (lees: 28 cijfers achter elkaar, met ofwel ergens een "punt" tussen de getallen, ofwel een berg nullen erachteraan).

Een Single (cq. float) kan dit niet - deze heeft bijna altijd precisieverlies omdat een gebroken getal 9 van de 10 keer niet exact in een float-representatie kan worden uitgedrukt.
Ik ben het even nagegaan, het gaat fout bij het omzetten van String naar Decimal. Het getal wordt wel omgezet, maar de punt gaat verloren. Hetzelfde geldt voor Decimal.Parse.

Visual Basic .NET:
1
2
3
4
    Private Function CheckDecimal(ByVal value As String) As Nullable(Of Decimal)
  
                CheckDecimal = Convert.ToDecimal(value)
                Console.WriteLine(CheckDecimal)

Verwijderd

Kijk eens naar: \[C# 2.0] Bepalen # getallen achter de komma. Daar staan meer posts omtrent dit onderwerp.

Het is overigens niet gebruikelijk om de SQL connectie op te houden, omdat je dan de SQL Server connectie pool leeg trekt en er op een gegeven moment mogelijk niemand meer kan connecten naar de database omdat jouw applicatie de connecties vast houdt.

[ Voor 15% gewijzigd door Verwijderd op 12-04-2007 07:57 . Reden: Verkeerde url ]


  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Verwijderd schreef op donderdag 12 april 2007 @ 00:20:
[...]


Ik ben het even nagegaan, het gaat fout bij het omzetten van String naar Decimal. Het getal wordt wel omgezet, maar de punt gaat verloren. Hetzelfde geldt voor Decimal.Parse.
Visual Basic .NET:
1
2
3
4
    Private Function CheckDecimal(ByVal value As String) As Nullable(Of Decimal)
  
                CheckDecimal = Convert.ToDecimal(value)
                Console.WriteLine(CheckDecimal)
Lol, hoe vaak ik dat al niet ben tegengekomen. :)

Het probleem ligt aan je culture-instellingen. Blijkbaar heb jij je windows (of in ieder geval die thread) op nederlands staan, en dan verwacht hij een komma als scheidingsteken.

Er is nog een overload van ToDecimal waarmee je dit kunt oplossen:
C#:
1
2
3
decimal d = Convert.ToDecimal(stringValue, System.Globalization.CultureInfo.InvariantCulture);
//of, als je een specifieke culture wilt gebruiken:
decimal d = Convert.ToDecimal(stringValue, System.Globalization.CultureInfo.CreateSpecificCulture("en-US"));

Verwijderd

Topicstarter
MrBucket schreef op donderdag 12 april 2007 @ 08:32:
[...]

Lol, hoe vaak ik dat al niet ben tegengekomen. :)

Het probleem ligt aan je culture-instellingen. Blijkbaar heb jij je windows (of in ieder geval die thread) op nederlands staan, en dan verwacht hij een komma als scheidingsteken.

Er is nog een overload van ToDecimal waarmee je dit kunt oplossen:
C#:
1
2
3
decimal d = Convert.ToDecimal(stringValue, System.Globalization.CultureInfo.InvariantCulture);
//of, als je een specifieke culture wilt gebruiken:
decimal d = Convert.ToDecimal(stringValue, System.Globalization.CultureInfo.CreateSpecificCulture("en-US"));
Bedankt, dat werkt perfect. Waarschijnlijk wordt dit afgeleid van de toetsenbord instelling (NL) aangezien ik wel de UK editie van XP gebruik.

Om nog even verder te gaan op de SQL connection. Het gaat hier om een database die wordt gebruikt door enkel één persoon. De database moet in dezelfde directory komen te staan als de executable. Geen andere personen kunnen gebruik maken van de database. Is het in dat geval nog steeds aan te raden om telkens de connectie te openen en te sluiten bij elke database actie? Hoe kan ik het database object het beste globaal aanmaken (met scope in alle classes en forms); moet je hiervoor een module gebruiken?

Verwijderd

Topicstarter
Verwijderd schreef op donderdag 12 april 2007 @ 12:14:
[...]

Om nog even verder te gaan op de SQL connection. Het gaat hier om een database die wordt gebruikt door enkel één persoon. De database moet in dezelfde directory komen te staan als de executable. Geen andere personen kunnen gebruik maken van de database. Is het in dat geval nog steeds aan te raden om telkens de connectie te openen en te sluiten bij elke database actie? Hoe kan ik het database object het beste globaal aanmaken (met scope in alle classes en forms); moet je hiervoor een module gebruiken?

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 08:30

gorgi_19

Kruimeltjes zijn weer op :9

Verwijderd schreef op donderdag 12 april 2007 @ 12:14:
Om nog even verder te gaan op de SQL connection. Het gaat hier om een database die wordt gebruikt door enkel één persoon. De database moet in dezelfde directory komen te staan als de executable. Geen andere personen kunnen gebruik maken van de database. Is het in dat geval nog steeds aan te raden om telkens de connectie te openen en te sluiten bij elke database actie?
Ja, je hebt een connectionpool
Hoe kan ik het database object het beste globaal aanmaken (met scope in alle classes en forms); moet je hiervoor een module gebruiken?
Singleton van maken.

[ Voor 66% gewijzigd door gorgi_19 op 15-04-2007 12:21 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo

Pagina: 1