Trädvy Permalänk
Medlem
Plats
Karlstad
Registrerad
Mar 2003

C# double to int

Hej!

Har gjort en funktion med hjälp av Timespan för att ta reda på antalet dagar mellan två datum.
Funktionen fungerar ypperligt, men kanske lite för precist.

Jag får svaret i ett flyttal, om det är 2 dagar och 12timmar mellan A och B returnerar den 2,5.
I och med att jag vill ha hela dagar konverterade jag till int, inget problem med det men jag klarar mig gott utan jag vill inte att den ska returnera 3 vid exemplet ovan utan 2. 2 ska det vara även om det är 2,99 dagar.

Finns det mån metod för konvertering UTAN överslag.

K#

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007

Nu har jag ingen riktig koll på hur C# uppför sig, men kan du inte bara konvertera till en int? Dvs.

double d = 2.99; int i = (int)d;

Du kanske inte ens behöver (int)-biten, det beror på om C# tillåter implicit konvertering från flyttal till heltal eller inte.

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jul 2007
Skrivet av perost:

Du kanske inte ens behöver (int)-biten, det beror på om C# tillåter implicit konvertering från flyttal till heltal eller inte.

C# tillåter inte implicit konvertering när det finns risk att man tappar information, som vid konvertering från flyttal till heltal. Andra vägen går bra däremot (vilket förstås inte är helt riskfritt ändå eftersom ett flyttal kan ha begränsad precision för stora tal).

Trädvy Permalänk
Medlem
Plats
Borlänge
Registrerad
Mar 2005

Det är Math.Floor() du söker.

Bra, snabbt, billigt; välj två.

Ljud
PC → ODAC → Objective2 → Sennheiser HD650/Ultrasone PRO 900
Portabelt → Sennheiser Momentum/Sennheiser Urbanite XL/Sennheiser Momentum In-Ear

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jul 2007
Skrivet av Phod:

Det är Math.Floor() du söker.

Skillnaden mellan Math.Floor() och en cast är att floor rundar ner mot minus oändligheten, och en cast trunkerar värdet, dvs avrundar mot noll. Det blir bara en skillnad för negativa tal.

int a = (int)Math.Floor(3.7); // a == 3 int b = (int)3.7; // b == 3 int c = (int)Math.Floor(-3.7); // c == -4 int d = (int)-3.7; // d == -3

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Maj 2006

Du har även Math.Round() om du vill göra en avrundning, dvs:
2.5 => 3
2.1 => 2

Trädvy Permalänk
Medlem
Plats
Finland
Registrerad
Okt 2002
Skrivet av harre:

Du har även Math.Round() om du vill göra en avrundning, dvs:
2.5 => 3
2.1 => 2

Kom ihåg bara att default avrundning är "ToEven"! Vilket inte är normal avrundning i vår del av världen...

double test = 3.445; double res = Math.Round(test, 2); //3.44 double res1 = Math.Round(test, 2, MidpointRounding.ToEven); //3.44 double res2 = Math.Round(test, 2, MidpointRounding.AwayFromZero); //3.45

"Mies saa kaatua mutta ei karata." -- Adolf Ehrnrooth IR 7, Äyräpää 1944.

Trädvy Permalänk
Medlem
Plats
Karlstad
Registrerad
Mar 2003
Skrivet av Phod:

Det är Math.Floor() du söker.

Tackar!, visste väl att det fanns något sätt att handskas med detta avrundningsproglem.
Math.Floor() fixade till det i och med att jag bara har unsignade ints. Slapp i och med detta min "fullösning" som genererade ibland -1 vid 0 posten också.

K#

Trädvy Permalänk
Medlem
Plats
Västra Frölunda
Registrerad
Maj 2004

kastar mig in i detta lite sent kanske, men det finns ju TimeSpan.Days och TimeSpan.TotalDays, där den första returnerar int och den andra double.

as far as we can tell, the massacre went well...

Trädvy Permalänk
Medlem
Plats
Karlstad
Registrerad
Mar 2003
Skrivet av jovnas:

kastar mig in i detta lite sent kanske, men det finns ju TimeSpan.Days och TimeSpan.TotalDays, där den första returnerar int och den andra double.

Damn, even better.
Tack, ändrade till denna funktion. Blir en konvertering mindre med denna kod.
Jag måste lära mig att använda msdn bättre.

K#

Trädvy Permalänk
Medlem
Registrerad
Feb 2017

@Turbo_tail

]

double test = 3.445;

double res = Math.Round(test, 2); //3.44
double res1 = Math.Round(test, 2, MidpointRounding.ToEven); //3.44
double res2 = Math.Round(test, 2, MidpointRounding.AwayFromZero); //3.45
[/code]
[/quote]

Tack, var precis vad jag behövde just nu!
Du räddade min dag!