Permalänk
Medlem

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.

Visa signatur

K#

Permalänk
Medlem

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.

Permalänk
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).

Permalänk
Medlem

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

Visa signatur

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

Ljud
PC → ODAC/O2 → Sennheiser HD650/Ultrasone PRO 900/...
PC → S.M.S.L SA300 → Bowers & Wilkins 607

Permalänk
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

Permalänk
Medlem

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

Permalänk
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

Visa signatur

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

Permalänk
Medlem
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å.

Visa signatur

K#

Permalänk
Medlem

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.

Visa signatur

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

Permalänk
Medlem
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.

Visa signatur

K#

Permalänk

@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!

Permalänk
Medlem
Skrivet av Turbo_tail:

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

Skrivet av Kalebsson:

@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!

Även idag räddar du folk, så här dryga åtta år senare Thank heaven för det här inlägget!

Visa signatur

NCASE M1
CPU 5800X w/ NH-U9S MB ROG STRIX B550-I GAMING
GPU RTX 3070 VENTUS 3X OC M.2 2TB Samsung 970 EVO Plus
RAM Corsair 32GB 3200MHz PSU Corsair SF750 750W 80+ Platinum
LJUD ATH-AD1000X w/ Pro-Ject Head Box S BILD Acer XB271HU @ 165Hz