Avatar billede linemus83 Nybegynder
12. april 2005 - 11:13 Der er 61 kommentarer og
1 løsning

Afrunding af decimaler

Hejsa,

Jeg har et datagrid, hvortil jeg med en stored procedure udtrækker nogle tal til. Disse kommer ud med 4 decimaler - f.eeks.: 99,5000. Hvordan får jeg dette til kun at være 2 decimaler?
Avatar billede the_party_dog Nybegynder
12. april 2005 - 11:14 #1
System.Math.Round(tal, 2);

Det er noget i den stil du skal kigge efter.... Kan ikke lige huske syntax'en helt...
Avatar billede linemus83 Nybegynder
12. april 2005 - 11:18 #2
Det læste jeg godt noget om et andet sted, men er ikke klar over, hvor jeg skal skrive det henne, for jeg indlæser jo tallene direkte til mit datagrid.
Avatar billede the_party_dog Nybegynder
12. april 2005 - 11:18 #3
Så skal du afrunde på databasen....
Avatar billede linemus83 Nybegynder
12. april 2005 - 11:19 #4
Okay, ved jeg ikke, hvordan jeg gør.
Avatar billede the_party_dog Nybegynder
12. april 2005 - 11:21 #5
Har du Books online, som følger med til Sql Enterprise manager?

Hvis du leder efter Round der inde vil der stå noget informationer, men ellers kommer der lige noget kort her.
Avatar billede the_party_dog Nybegynder
12. april 2005 - 11:23 #6
This example shows two expressions illustrating that with the ROUND function the last digit is always an estimate.

SELECT ROUND(123.9994, 3), ROUND(123.9995, 3)
GO

Here is the result set:

----------- -----------
123.9990    124.0000   

Det vil sige at du skal smide Round() rundt om den kolonne du vil have rundet af, f.eks sådan her:

SELECT Navn, ROUND(Betaling,2) FROM Payments
Avatar billede linemus83 Nybegynder
12. april 2005 - 11:23 #7
Det aner jeg desværre ikke :-)
Avatar billede www.jakub.dk Nybegynder
12. april 2005 - 11:27 #8
Du kan vel i din CREATE TABLE definere feltet til at indeholde kun 2 decimaler... Det vil helt klart være det nemmeste.
Avatar billede linemus83 Nybegynder
12. april 2005 - 11:28 #9
Når jeg gør det, går det op i lort. Så virker en af mine andre funktioner ikke, og den kalder kolonnen 'Belob' for 'Column1' - og der er stadig 4 decimaler.
Avatar billede the_party_dog Nybegynder
12. april 2005 - 11:28 #10
jakub> Hvad nu hvis det er et mega gammelt system hun har overtaget arbejdet på, og ikke kan ændre de ting som ligger der i forvejen? Men skal selvfølgelige ikke kunne udtale mig om situationen, men vil tro hun havde prøvet andet inden hun spørger her :)
Avatar billede linemus83 Nybegynder
12. april 2005 - 11:29 #11
Det er ikke mig, der har lavet tabellerne. Jeg har prøvet på at se, om jeg kunne rette i dem, men ved ikke hvordan.
Avatar billede the_party_dog Nybegynder
12. april 2005 - 11:32 #12
Kom med kode, eller kolonne navne, så kigger vi lige på det :) Tror vi skal have gang i noget AS her... F.eks Round(Kolonne, 2) AS Belob, så kan det være din funktion kan få fat i den....

Når man bruger en aggreat funktion i SQL så kommer der ikke noget kolonne navn på den kolonne man arbejder med.
Avatar billede linemus83 Nybegynder
12. april 2005 - 11:33 #13
Det har jeg prøvet:

SELECT Bestilling, Dato, Konto, Bruger, ROUND(Belob,2) as Belob FROM Indbetalinger where Konto = @parmSalgsted and  Bestilling >= @parmStartnr
Avatar billede linemus83 Nybegynder
12. april 2005 - 11:35 #14
Jeg har stadig 4 decimaler med
Avatar billede the_party_dog Nybegynder
12. april 2005 - 11:35 #15
Lige det stykke kode, giver det ikke det ønskede resultat? Kan du evt teste det igennem Query analyzer?
Avatar billede the_party_dog Nybegynder
12. april 2005 - 11:38 #16
Det er min fejl.... Den runder af, men beholder det antal decimaler der i kolonnen....
Avatar billede linemus83 Nybegynder
12. april 2005 - 11:38 #17
Jeg ved ikke, hvad Query analyzer er. Men jeg får i hvert fald 4 decimaler efter kommaet - f.eks. 99,0000
Avatar billede www.jakub.dk Nybegynder
12. april 2005 - 11:38 #18
party_dog>Jeg har antaget at DB er hendes egen. Ligesom du har antaget at hun bruger SQL Server. :-)
Avatar billede linemus83 Nybegynder
12. april 2005 - 11:41 #19
Har scale noget at gøre med, hvor mange decimaler, der er ?
Avatar billede the_party_dog Nybegynder
12. april 2005 - 11:41 #20
Jakub> Du vinder :)

Jeg har et lille forslag.... Men det er noget klyt, men måske virker det :)

SELECT Bestilling, Dato, Konto, Bruger, CAST(ROUND(Belob,2) AS DECIMAL(20,2)) as Belob FROM Indbetalinger where Konto = @parmSalgsted and  Bestilling >= @parmStartnr
Avatar billede linemus83 Nybegynder
12. april 2005 - 11:43 #21
Den virkede - tak, skal du have :-)

Smid et svar.
Avatar billede linemus83 Nybegynder
12. april 2005 - 11:48 #22
Kan du eventuelt også hjælpe med en anden ting?

    DataTable dt = ds.Tables[0];
            double sum = 0;
            for (int i=0;i<dt.Rows.Count;i++)
            {
                double val = Convert.ToDouble(dt.Rows[i]["Belob"]);
                sum += val;
            }

Hvorfor tager denne kun en decimal og ikke to, som der jo er i datagridet?
Avatar billede the_party_dog Nybegynder
12. april 2005 - 11:48 #23
Line> Det var så lidt.... Må jeg stille dig et (personligt) spørgsmål? De opgaver du spørger om her inde, er det noget fritids noget, eller er det en del af dit job? Er bare lidt nysgerrig, håber det er okay...
Avatar billede linemus83 Nybegynder
12. april 2005 - 11:49 #24
Det er noget til mit studiejob - hvad da ?
Avatar billede the_party_dog Nybegynder
12. april 2005 - 11:50 #25
Først ville jeg nok oprette din double val uden for din løkke, eller vil der blive oprettet lige så mange variabler, som løkken kører.

Men den burde tage mere end et decimal med, når du converter til double....
Avatar billede the_party_dog Nybegynder
12. april 2005 - 11:50 #26
Ikke noget særligt, er bare et nysgerrigt menneske :-) Kan godt lide at lære lidt om folk, selvom det kun er over nettet....
Avatar billede linemus83 Nybegynder
12. april 2005 - 11:51 #27
Okay, helt i orden :-) Hvad med dig da ?
Avatar billede linemus83 Nybegynder
12. april 2005 - 11:51 #28
Men altså - den tager kun en decimal med.
Avatar billede the_party_dog Nybegynder
12. april 2005 - 11:58 #29
Jeg er lærling som Datafagtekniker, og laver pt ikke andet end at rode med og lære C# og MSSQL, så det hedder 8 timer om dagen med C#.

Omkring dit problem med at den kun tager et decimal, så må vi lige se på hvordan den opfatter det som står i dit datagrid. Kan du ikke udlæse dt.Rows[i]["Belob"] til en string variabel, og se hvordan den variabel ser ud, inden du conventere den?

DataTable dt = ds.Tables[0];
            double sum = 0.00;
            string Test = "";
            for (int i=0;i<dt.Rows.Count;i++)
            {
                Test = Convert.ToString(dt.Rows[i]["Belob"]);
                sum += Convert.ToDouble(Test);
            }
Avatar billede linemus83 Nybegynder
12. april 2005 - 11:59 #30
Okay, en af mine gode venner er også lærling som Datafagteknikker.
Avatar billede www.jakub.dk Nybegynder
12. april 2005 - 11:59 #31
Jeg tror at double tager kun de decimaler med som der er burg for. F. eks. vil en værdi 2.00 være 2 som double eller 2.10 vil være 2.1 som double.

Jeg har ikke testet dette, jeg antager bare at sådan er det.

Er det val eller sum, som kun tager en decimal med. Det er sum du mener ikke?
Avatar billede the_party_dog Nybegynder
12. april 2005 - 12:02 #32
jakum> Det lyder som et godt argument hvorfor den kun skulle skrive 2.1 f.eks, det havde min hjerne lige overset som mulighed, men igen, jeg skal have eksempler at kigge på. Min teoretiske viden er slet ikke god nok til at kunne svare uden at afprøve ting.... :-)
Avatar billede linemus83 Nybegynder
12. april 2005 - 12:02 #33
Jeg har lige kørt dét, du skrev, og det gav det samme som før.

Men jeg tror, du har ret i det, du skriver.

Men jo, jeg udskriver sum her: Label4.Text = sum.ToString() + " kroner";, og der er kun en decimal - pånær hvis det giver feks 1000,75, så tager den det med - men ikke, hvis det er et 0.
Avatar billede linemus83 Nybegynder
12. april 2005 - 12:03 #34
Men ved du så, hvordan jeg får begge med ? Selvom det er et 0.
Avatar billede www.jakub.dk Nybegynder
12. april 2005 - 12:03 #35
party dog> kender det godt...er også en af dem som skal afprøve ting og sager.
Avatar billede the_party_dog Nybegynder
12. april 2005 - 12:03 #36
Så fik vi da opklaret det mysterium.... :) Godt at have flere hoveder til at hjælpe med at løse det, godt input jakum.... :-)
Avatar billede www.jakub.dk Nybegynder
12. april 2005 - 12:05 #37
Ja... Du kan gøre følgende:

string sumString = sum.ToString();
if (sumString.Length - SumString.IndexOf(".")<2)
  sumString += "0";
Avatar billede the_party_dog Nybegynder
12. april 2005 - 12:07 #38
jakum > Det må jeg sige, det var et hurtig lige trick du kunne der... Det skal jeg da lige huske... Skide smart tænkt.....
Avatar billede linemus83 Nybegynder
12. april 2005 - 12:08 #39
Det virker så ikke - der er stadig kun 1 decimal.
Avatar billede www.jakub.dk Nybegynder
12. april 2005 - 12:09 #40
Så tager vi en mere omfattende:

string sumString = sum.ToString();
if (sumString.Length - SumString.IndexOf(".")<1)
  sumString += "0";
if (sumString.Length - SumString.IndexOf(".")<2)
  sumString += "0";

Prøv dette.
Avatar billede the_party_dog Nybegynder
12. april 2005 - 12:10 #41
line> Du skal så huske at bruge sumString når du vil skrive det endelig resultat ud til din label....

DataTable dt = ds.Tables[0];
            double sum = 0;
            for (int i=0;i<dt.Rows.Count;i++)
            {
                double val = Convert.ToDouble(dt.Rows[i]["Belob"]);
                sum += val;
            }
string sumString = sum.ToString();
if (sumString.Length - SumString.IndexOf(".")<2)
  sumString += "0";

Label4.Text = sumString + " kroner";
Avatar billede www.jakub.dk Nybegynder
12. april 2005 - 12:10 #42
Muligvis sådan hvis der mangler et komma:

string sumString = sum.ToString();
if (sumString.Length - SumString.IndexOf(".")<1)
  sumString += ".0";
if (sumString.Length - SumString.IndexOf(".")<2)
  sumString += "0";
Avatar billede linemus83 Nybegynder
12. april 2005 - 12:11 #43
Det virker heller ikke. Det samme som før.
Avatar billede www.jakub.dk Nybegynder
12. april 2005 - 12:11 #44
Jeps og du skal i hvert fald bruge sumString i stedet for sum
Avatar billede linemus83 Nybegynder
12. april 2005 - 12:11 #45
Har jeg gjort ;-)
Avatar billede linemus83 Nybegynder
12. april 2005 - 12:13 #46
Jeg tror måske, den der IndexOf skal have nogle flere parametre med.
Avatar billede the_party_dog Nybegynder
12. april 2005 - 12:14 #47
nej... Jeg tror jeg har det... I samme sekund du laver en double om til en tekst, ved hjælp af .ToString vil den bruge de regionale indstillinger til formatere tallet med. I dk bruger vi komma til at dele mellem hel tal og decimaler. Jakums leder kun efter punktum, som er amerikansk....

Jeg tror du skal erstatte hans punktumer med komma'er....
Avatar billede linemus83 Nybegynder
12. april 2005 - 12:15 #48
Det har jeg gjort også :) Og det er det samme.
Avatar billede linemus83 Nybegynder
12. april 2005 - 12:17 #49
Jeg tror ikke, man skal bruge IndexOf.
Avatar billede linemus83 Nybegynder
12. april 2005 - 12:18 #50
IndexOf fortæller jo, hvilken plads ,'et er på.
Avatar billede linemus83 Nybegynder
12. april 2005 - 12:20 #51
I mit tilfælde giver sumString 34020,5, og så har ,'et altså plads nummer 5. Så det kan man jo ikke bruge til noget :-)
Avatar billede the_party_dog Nybegynder
12. april 2005 - 12:20 #52
Det skal du også bruge til noget :-) Har en halv løsning, hvis der altid er et decimal på dit tal, vil dette virke:

if (sumString.Length - sumString.IndexOf(",")<=2)
            {
                sumString += "0";
            }
Avatar billede linemus83 Nybegynder
12. april 2005 - 12:20 #53
Hm...nu sidder jeg vist og tåger lidt.
Avatar billede linemus83 Nybegynder
12. april 2005 - 12:21 #54
Den sidste der virker
Avatar billede the_party_dog Nybegynder
12. april 2005 - 12:22 #55
Og det her virker perfekt:

        if (sumString.IndexOf(",") == -1)
            {
                sumString += ",0";
            }
            if (sumString.Length - sumString.IndexOf(",")<=2)
            {
                sumString += "0";
            }
Avatar billede the_party_dog Nybegynder
12. april 2005 - 12:35 #56
Hallo... Line? Gik det rent ind, eller?
Avatar billede linemus83 Nybegynder
12. april 2005 - 12:35 #57
Tak :-)
Avatar billede linemus83 Nybegynder
12. april 2005 - 12:36 #58
Jeps :-) Men det første virkede lige så godt.
Avatar billede the_party_dog Nybegynder
12. april 2005 - 12:38 #59
Ja.. Men det første tager ikke højde for om dit slet ikke har decimaler på.... :) Det gør det sidste, så først tjekker den om der er decimaler, og så tjekker den om der er 2 decimaler.... :)

Må heller ligge point lidt til jakum, han gav mig grund ideen....
Avatar billede www.jakub.dk Nybegynder
12. april 2005 - 14:03 #60
Det går nok.. -:) Og det er jakub :-)
Avatar billede the_party_dog Nybegynder
12. april 2005 - 14:04 #61
Hahhahahahaha...

Det må du meget undskylde... Jeg har virkelig set det som jakum.... Det er meget pinligt... :-( NYD VEJRET!
Avatar billede www.jakub.dk Nybegynder
12. april 2005 - 16:06 #62
I lige måde :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester



Seneste spørgsmål Seneste aktivitet
I går 20:46 opkaldside Af hagbartm i Mobiltelefoner
I går 16:05 win 10 vil ikke boote Af bb69 i Windows
I går 11:20 Lenovo x390 Af tobberjas i PC
I går 10:14 Alder i Excel Af Nanarsi i Excel
I går 09:00 Flere linier på faneblad Af Peder Lund Nielsen i Excel