Premiär! Fyndchans i SweClockers Månadens Drop
Permalänk
Avstängd

[C#] Dela med tal blir noll

Tjo,

Har problem att dela tal den blir bara noll någon som har lust att lista ut vad som kan vara felet?

Försöker räkna ut det i % men blir bara 0 ibland 100%.

Test kod
https://dotnetfiddle.net/Yc3kQf

Visa signatur

Man är inte dum för att man har stavproblem.
Läs mer om min synfel Visual Snow
Om mig ----> #16970666

Permalänk
Medlem

@superegg:

Kan det vara för att resultatet av divisionen blir ett decimaltal som en int inte kan lagra?

Visa signatur

There is always a price to pay for convenient

Permalänk
Medlem

Gjorde om variablerna till double, och då funkade det.
Problemet beror antagligen för att metoden WriteLine tror att argumentet är en int, eftersom variablerna är det och dom ligger som argument.

Visa signatur

There is always a price to pay for convenient

Permalänk
Medlem

Precis som smkr sa! He beat me to it

Visa signatur

Citera mig gärna vid svar (:

Permalänk
Medlem

Försökte kolla definitionen av metoden för att se vad returvärdet är för typ, men kunde inte se. Men förmodligen är returvärdet av samma data-typ som argumenten.

Visa signatur

There is always a price to pay for convenient

Permalänk

Dina variabler är int, dvs heltal utan decimaler.
De behöver castas till någon form av decimal tal först.

https://docs.microsoft.com/en-us/dotnet/csharp/language-refer...
When you divide two integers, the result is always an integer.

Permalänk
Medlem

Om man av någon anledning är begränsad till heltal och vill ha ut procent så kan du gör så här:
Console.WriteLine(100 * JobbStatusMin / JobbStatusMax);

Permalänk
Avstängd

Tack alla jag provade först med double igår men fick det heller inte att funka men nu när jag prova med double så funkar det måste ha missat något men nu funkar det.

Visa signatur

Man är inte dum för att man har stavproblem.
Läs mer om min synfel Visual Snow
Om mig ----> #16970666

Permalänk
Medlem
Skrivet av smkr:

Försökte kolla definitionen av metoden för att se vad returvärdet är för typ, men kunde inte se. Men förmodligen är returvärdet av samma data-typ som argumenten.

Jupp, men räkna med att resultatet är samma som det minst noggranna argumentet, så 110.0 / 100 blir 1 vill du ha resultatet bättre måste du skriva 110.0 / 100F för att tala om att 100 är ett flyttal och inte ett heltal. (110.0 kommer kompilatorn att tolka som ett dubbelt flyttal) Detta är inte sant i alla fall men jag har inte kommit på när den väljer det ena eller det andra så jag tar alltid det säkra alternativet

int t = 110; int n = 100; debug.print(t/n); //Kommer alltid skriva ut 1 debug.print((float)t/n); / kommer ibland att skriva ut 1 eller 1.1 debug.print(t/(float)n); / kommer ibland att skriva ut 1 eller 1.1 debug.print((float)t / (float)n); //Kommer alltid skriva ut 1.1

Visa signatur

"Om man arbetar tillräckligt länge med att förbättra ett föremål går det sönder. "

Hjälp oss göra världen lite snällare! www.upphittat.nu

Permalänk
Medlem

@ZecretW: / i C# kommer alltid utföra flyttalsdivision om en av operanderna är ett flyttal, heltalsdivision utförs endast om båda operanderna är heltal. Så (float)t/n och t/(float)n i ditt exempel kommer alltid resultera i 1.1.

Permalänk
Medlem
Skrivet av ZecretW:

Jupp, men räkna med att resultatet är samma som det minst noggranna argumentet, så 110.0 / 100 blir 1 vill du ha resultatet bättre måste du skriva 110.0 / 100F för att tala om att 100 är ett flyttal och inte ett heltal. (110.0 kommer kompilatorn att tolka som ett dubbelt flyttal) Detta är inte sant i alla fall men jag har inte kommit på när den väljer det ena eller det andra så jag tar alltid det säkra alternativet

int t = 110; int n = 100; debug.print(t/n); //Kommer alltid skriva ut 1 debug.print((float)t/n); / kommer ibland att skriva ut 1 eller 1.1 debug.print(t/(float)n); / kommer ibland att skriva ut 1 eller 1.1 debug.print((float)t / (float)n); //Kommer alltid skriva ut 1.1

Japp, helt rätt. Som @perost: skrev så omvandlas det alltid till decimal om en sådan finns som en av inparametrarna.
Antagligen då en int explicit kan omvandlas till ett decimaltal, men inte tvärt om.
Skulle man skriva "retValue = Method(double / float)" så kommer troligen returen bli en double, då double kan rymma större tal än float.

Min spontana uppfattning är att det är denna logik som gäller.

Visa signatur

There is always a price to pay for convenient

Permalänk
Medlem
Skrivet av smkr:

Japp, helt rätt. Som @perost: skrev så omvandlas det alltid till decimal om en sådan finns som en av inparametrarna.
Antagligen då en int explicit kan omvandlas till ett decimaltal, men inte tvärt om.
Skulle man skriva "retValue = Method(double / float)" så kommer troligen returen bli en double, då double kan rymma större tal än float.

Min spontana uppfattning är att det är denna logik som gäller.

Korrekt, se C#-specifikationen för hur operanderna typkonverteras.

decimal är för övrigt en speciell datatyp i C# som är skild från float och double. Termen som vanligtvis används för float och double är istället flyttal.

Permalänk
Medlem

Integers i C# stödjer bara heltal och gör en automatisk avrundning ifall du delar två stycken integers.
1/4 = 0,25. Automatiskt avrundning till 0.
0*100 = 0.

Permalänk
Hedersmedlem
Skrivet av Terrell:

Integers i C# stödjer bara heltal och gör en automatisk avrundning ifall du delar två stycken integers.
1/4 = 0,25. Automatiskt avrundning till 0.
0*100 = 0.

Det är väl en trunkering, inte avrundning? 9/10 borde fortfarande resultera i 0

Permalänk
Avstängd
Skrivet av Shimonu:

Det är väl en trunkering, inte avrundning? 9/10 borde fortfarande resultera i 0

Jo precis. Och noll gånger hundra är ju noll så varken trunkering eller avrundning sker i det fallet.

Permalänk
Medlem
Skrivet av Shimonu:

Det är väl en trunkering, inte avrundning? 9/10 borde fortfarande resultera i 0

Ja jag såg det nu. Det är Convert.ToInt32 som gör en automatisk avrundning vid hantering av decimaler.

Permalänk
Medlem

@Terrell: Integer betyder bokstavligen "heltal" så att de inte kan innehålla decimaler är rätt givet

Visa signatur

Kom-pa-TI-bilitet