Het dubbele beperken tot 3 decimalen

Dit is wat ik probeer te bereiken:

Als een dubbel meer dan 3 decimalen heeft, wil ik alle decimalen na de derde afkappen. (niet afronden.)

Eg.: 12.878999 -> 12.878

Als een dubbel minder dan 3 decimalen heeft, laat dit dan ongewijzigd

Eg.:   125   -> 125
       89.24 -> 89.24

Ik kwam dit commando tegen:

double example = 12.34567;
double output = Math.Round(example, 3);

Maar ik wil niet afronden. Volgens het hierboven geposte commando,
12.34567 -> 12.346

Ik wil de waarde afkappen zodat deze wordt: 12.345


Antwoord 1, autoriteit 100%

Dubbels hebben geen decimalen – ze zijn niet gebaseerd op decimale cijfers om mee te beginnen. Je zou “het dichtst bij de huidige waarde liggen als het wordt afgekapt tot drie decimalen”, maar het zou nog steeds niet precies hetzelfde zijn. Je kunt beter decimalgebruiken.

Dat gezegd hebbende, als alleen de manier waarop afronding plaatsvindt een probleem is, kun je Math.Truncate(value * 1000) / 1000;gebruiken, wat mogelijkdoet wat je wilt. (Je wilt helemaal geen afronding, zo te horen.) Het is echter nog steeds potentieel “onbetrouwbaar”, omdat het resultaat nog steeds niet echt slechts drie decimalen heeft. Als je echter hetzelfde deed met een decimale waarde, zou het zouwerken:

decimal m = 12.878999m;
m = Math.Truncate(m * 1000m) / 1000m;
Console.WriteLine(m); // 12.878

EDIT: Zoals LBushkin al aangaf, moet je duidelijk zijn tussen afkappen voor weergave-doeleinden (wat meestal kan worden gedaan in een formaatspecificatie) en afkappen voor verdere berekeningen (in welk geval het bovenstaande zou moeten werken ).


Antwoord 2, autoriteit 76%

Ik kan geen reden bedenken om expliciet precisie te verliezen buiten weergavedoeleinden. Gebruik in dat geval gewoon tekenreeksopmaak.

double example = 12.34567;
Console.Out.WriteLine(example.ToString("#.000"));

Antwoord 3, autoriteit 33%

double example = 3.1416789645;
double output = Convert.ToDouble(example.ToString("N3"));

Antwoord 4, autoriteit 10%

Vermenigvuldigen met 1000 en vervolgens Truncategebruiken en vervolgens delen door 1000.


Antwoord 5, autoriteit 9%

Als je doel bij het afkappen van de cijfers is om weergaveredenen, gebruik dan gewoon een geschikte opmaak wanneer je het dubbele naar een tekenreeks converteert.

Methoden zoals String.Format()en Console.WriteLine()(en andere) stellen u in staat om het aantal nauwkeurige cijfers waarmee een waarde wordt opgemaakt te beperken.

Pogingen om getallen met drijvende komma te “afkappen” is niet aan te raden– getallen met drijvende komma hebben in veel gevallen geen nauwkeurige decimale weergave. Als u een benadering toepast, zoals het getal omhoog schalen, afkappen en vervolgens omlaag schalen, kan de waarde gemakkelijk veranderen in iets heel anders dan u had verwacht voor de “afgekapte” waarde.

Als je nauwkeurige decimale representaties van een getal nodig hebt, moet je decimalgebruiken in plaats van doubleof float.


Antwoord 6, autoriteit 4%

U kunt gebruiken:

double example = 12.34567;
double output = ( (double) ( (int) (example * 1000.0) ) ) / 1000.0 ;

Antwoord 7, autoriteit 3%

Goede antwoorden hierboven – als u op zoek bent naar iets dat herbruikbaar is, vindt u hier de code. Houd er rekening mee dat je misschien de waarde van de decimalen wilt controleren, en dit kan overlopen.

public static decimal TruncateToDecimalPlace(this decimal numberToTruncate, int decimalPlaces)
{
    decimal power = (decimal)(Math.Pow(10.0, (double)decimalPlaces));
    return Math.Truncate((power * numberToTruncate)) / power;
}

Antwoord 8

In C lang:

double truncKeepDecimalPlaces(double value, int numDecimals)
{
    int x = pow(10, numDecimals);
    return (double)trunc(value * x) / x;
}

Other episodes