Ich habe 3 sehr große vorzeichenbehaftete Ganzzahlen.
long x = long.MaxValue;
long y = long.MaxValue - 1;
long z = long.MaxValue - 2;
Ich möchte ihren abgeschnittenen Durchschnitt berechnen. Der erwartete Durchschnittswert ist long.MaxValue - 1
, das heißt 9223372036854775806
.
Es ist unmöglich, es zu berechnen als:
long avg = (x + y + z) / 3; // 3074457345618258600
Hinweis: Ich habe all diese Fragen zum Durchschnitt von 2 Zahlen gelesen, sehe aber nicht, wie diese Technik auf den Durchschnitt von 3 Zahlen angewendet werden kann.
Es wäre sehr einfach mit der Verwendung von BigInteger
, aber nehmen wir an, ich kann es nicht verwenden.
BigInteger bx = new BigInteger(x);
BigInteger by = new BigInteger(y);
BigInteger bz = new BigInteger(z);
BigInteger bavg = (bx + by + bz) / 3; // 9223372036854775806
Wenn ich konvertiere double
, verliere ich natürlich die Präzision:
double dx = x;
double dy = y;
double dz = z;
double davg = (dx + dy + dz) / 3; // 9223372036854780000
Wenn ich zu konvertiere decimal
, funktioniert es, aber nehmen wir auch an, dass ich es nicht verwenden kann.
decimal mx = x;
decimal my = y;
decimal mz = z;
decimal mavg = (mx + my + mz) / 3; // 9223372036854775806
Frage: Gibt es eine Möglichkeit, den abgeschnittenen Durchschnitt von 3 sehr großen Ganzzahlen nur unter Verwendung des long
Typs zu berechnen ? Betrachten Sie diese Frage nicht als C # -spezifisch, nur ist es für mich einfacher, Beispiele in C # bereitzustellen.
long.MinValue
und long.MaxValue
unter Werten habe.
BigInteger
oder decimal
ausgeschlossen ist , oder ist es nur um diese schwer zu machen?