Ich möchte eine Rundungsmethode für doppelte Werte in C#. Es muss in der Lage sein, einen doppelten Wert auf einen Rundungsgenauigkeitswert zu runden. Mein Code auf der Hand wie folgt aussieht:Runden von doppelten Werten in C#
public static double RoundI(double number, double roundingInterval) {
if (roundingInterval == 0.0)
{
return;
}
double intv = Math.Abs(roundingInterval);
double sign = Math.Sign(number);
double val = Math.Abs(number);
double valIntvRatio = val/intv;
double k = Math.Floor(valIntvRatio);
double m = valIntvRatio - k;
bool mGreaterThanMidPoint = ((m - 0.5) >= 1e-14) ? true : false;
bool mInMidpoint = (Math.Abs(m - 0.5) < 1e-14) ? true : false;
return (mGreaterThanMidPoint || mInMidpoint) ? sign * ((k + 1) * intv) : sign * (k * intv);
}
So RoundI (100, 3) 99 geben soll und RoundI (1,2345, 0,001) sollte 1,235 geben.
Das Problem ist, RoundI (1,275, 0,01) gibt 1,27 statt 1,28 zurück. Dies liegt daran, dass bei der Ausführung von double valIntvRatio = val/intv, also double valIntvRatio = 1.275/0.01, 0,12749999999999 angegeben wird. Ich weiß, das ist ein Problem mit doppelter Repräsentation in irgendeiner Programmiersprache. Meine Frage ist, gibt es einen Standard-Code, um Dinge wie diese zu tun, ohne sich Gedanken über die Genauigkeit im Doppel zu machen? Hier setze ich die Toleranz auf 1e-14, aber das ist zu restriktiv für dieses Problem und ich weiß nicht, was die richtige Toleranz sein soll. Danke für jede Hilfe.
Vielleicht sollten Sie den Dezimal-Datentyp verwenden. – Kibbee
Warum würde Runde (100,3) 99 geben? Wenn Sie auf die gleiche Bruchposition wie die 3 (0 Stellen) runden, erhalten Sie 100, nicht 99. – paxdiablo
paxdiablo: Entschuldigung, der Zweck von RoundI ist nicht zu runden, um den ersten Parameter auf dieselbe Bruchposition zu runden als zweiter Parameter. Der zweite Parameter ist das runde Intervall und die Rundung rundet den ersten Parameter auf den Schrankwert, der den Modus 0 hat, auf den zweiten Parameter. – Steve