Avrunda
Uppgift 2: Avrundaren
Denna uppgift handlar om flyttal och att avrunda sådana.
Uppgiften går ut på att du ska be användaren skriva in ett tal med decimaler.
Därefter ska ni be användaren skriva in hur många decimaler användaren vill ha.
Din kod ska avrunda talet enligt ovan, men också med ett på förbestämt antal decimaler (exempelvis tre).
jag vet inte vad ska jag göra sedan:
Console.WriteLine("Välj ett nummer med decimaler. ");
string T = Console.ReadLine();
Du behöver möjligen omvandla strängen till ett flyttal (kan inte c#).
Det bör finnas en funktion av typ
round(x)
som returnerar närmaste heltal.
Vad gör då
round(10*x)/10
?
hur blir koden då??
C# kan jag som sagt inte.
Du behöver hitta en funktion som omvandlar strängen T till ett flyttal.
Du behöver hitta en funktion som avrundar ett flyttal till närmaste heltal.
Vad säger Google?
Fundera sedan på vad
round(10*x)/10
om x = 4.123
och hur detta kan hjälpa dig för att lösa uppgiften.
Jag hittade ett sätt med Math.Round men det går inte mer än 15 antal decimaler, varför??
Det beror på hur många bitar som talet är. Omvandla strängen till decimal istället för double så bör det gå (ifall du inte nöjer dig med 15 decimaler).
double dvalue = Convert.ToDouble(Console.ReadLine());
int ivalue = Convert.ToInt32(dvalue) - 0.5; // Förutsatt att det inmatade talet är positivt
osv.
Affe Jkpg skrev:double dvalue = Convert.ToDouble(Console.ReadLine());
int ivalue = Convert.ToInt32(dvalue) - 0.5; // Förutsatt att det inmatade talet är positivt
osv.
Jag halkade visst på tangentbordet...
int ivalue = Convert.ToInt32(dvalue - 0.5); // Förutsatt att det inmatade talet är positivt
Affe Jkpg skrev:Affe Jkpg skrev:double dvalue = Convert.ToDouble(Console.ReadLine());
int ivalue = Convert.ToInt32(dvalue) - 0.5; // Förutsatt att det inmatade talet är positivt
osv.
Jag halkade visst på tangentbordet...
int ivalue = Convert.ToInt32(dvalue - 0.5); // Förutsatt att det inmatade talet är positivt
Om antalet önskade decimaler är större än noll då?
alex skrev:Jag hittade ett sätt med Math.Round men det går inte mer än 15 antal decimaler, varför??
Det beror på begränsningar i datatypen double.
Om du vill ha fler decimaler bör du istället använda datatypen decimal. Det ger dig 28-29 signifikanta siffror. Du kan fortfarande använda samma avrundningfunktion.
Här kan du läsa mer om funktionen Math.Round och de olika datatyperna.
Laguna skrev:Affe Jkpg skrev:Affe Jkpg skrev:double dvalue = Convert.ToDouble(Console.ReadLine());
int ivalue = Convert.ToInt32(dvalue) - 0.5; // Förutsatt att det inmatade talet är positivt
osv.
Jag halkade visst på tangentbordet...
int ivalue = Convert.ToInt32(dvalue - 0.5); // Förutsatt att det inmatade talet är positivt
Om antalet önskade decimaler är större än noll då?
Hur tänker du nu? Exempel:
3.6999 - 0.5 = 3.1999
Eller du tänker att jag inte presenterat ett facit, utan lämnat åt uppgiftskrivaren att fortsätta ....
Affe Jkpg skrev:Laguna skrev:Om antalet önskade decimaler är större än noll då?Hur tänker du nu? Exempel:
3.6999 - 0.5 = 3.1999
Eller du tänker att jag inte presenterat ett facit, utan lämnat åt uppgiftskrivaren att fortsätta ....
Kanske att funktionen ToInt32 returnerar ett heltal och att avrundningen blir fel?
Convert.ToInt32(3,1999) returnerar heltalet 3, vilket kan vara oönskat om indata är 3,6999.
Yngve skrev:Affe Jkpg skrev:Laguna skrev:Om antalet önskade decimaler är större än noll då?Hur tänker du nu? Exempel:
3.6999 - 0.5 = 3.1999
Eller du tänker att jag inte presenterat ett facit, utan lämnat åt uppgiftskrivaren att fortsätta ....
Kanske att funktionen ToInt32 returnerar ett heltal och att avrundningen blir fel?
Convert.ToInt32(3,1999) returnerar heltalet 3, vilket kan vara oönskat om indata är 3,6999.
Det borde vara bekant att heltalsdelen av t.ex. 3.6999 är 3
Då är det sedan inte långt borta att hitta decimaldelen av t.ex. 3.6999
Sedan finns det mängder av sätt att lösa uppgiften på.
Affe Jkpg skrev:
Det borde vara bekant att heltalsdelen av t.ex. 3.6999 är 3Då är det sedan inte långt borta att hitta decimaldelen av t.ex. 3.6999
Sedan finns det mängder av sätt att lösa uppgiften på.
Jaha du tänkte så. Istället för att använda Math.Floor alltså. Det fattade inte jag. Inte heller Laguna verkar det som. Vi kan hoppas att TS gjorde det.
Eftersom du inte skrev att du föreslog en alternativ metod (att dela upp i heltalsdel och decimaldel), så trodde åtminstone jag att du fortsatte på den väg som Dr. G pekat ut.
Dr. G skrev:Det beror på hur många bitar som talet är. Omvandla strängen till decimal istället för double så bör det gå (ifall du inte nöjer dig med 15 decimaler).
Det stämmer
Tack så mycket