Saya memiliki 3 bilangan bulat bertanda tangan yang sangat besar.
long x = long.MaxValue;
long y = long.MaxValue - 1;
long z = long.MaxValue - 2;
Saya ingin menghitung rata-rata terpotongnya. Nilai rata-rata yang diharapkan adalah long.MaxValue - 1
, yaitu 9223372036854775806
.
Tidak mungkin menghitungnya sebagai:
long avg = (x + y + z) / 3; // 3074457345618258600
Catatan: Saya membaca semua pertanyaan tentang rata-rata 2 angka, tetapi saya tidak melihat bagaimana teknik itu dapat diterapkan pada rata-rata 3 angka.
Ini akan sangat mudah dengan penggunaan BigInteger
, tapi mari kita asumsikan saya tidak bisa menggunakannya.
BigInteger bx = new BigInteger(x);
BigInteger by = new BigInteger(y);
BigInteger bz = new BigInteger(z);
BigInteger bavg = (bx + by + bz) / 3; // 9223372036854775806
Jika saya mengonversi ke double
, maka, tentu saja, saya kehilangan presisi:
double dx = x;
double dy = y;
double dz = z;
double davg = (dx + dy + dz) / 3; // 9223372036854780000
Jika saya mengonversi ke decimal
, itu berfungsi, tetapi juga anggaplah saya tidak dapat menggunakannya.
decimal mx = x;
decimal my = y;
decimal mz = z;
decimal mavg = (mx + my + mz) / 3; // 9223372036854775806
Pertanyaan: Apakah ada cara untuk menghitung rata-rata terpotong dari 3 bilangan bulat yang sangat besar hanya dengan penggunaan long
tipe? Jangan anggap pertanyaan itu spesifik C #, hanya lebih mudah bagi saya untuk memberikan contoh dalam C #.
long.MinValue
dan di long.MaxValue
antara nilai.
BigInteger
atau decimal
dikecualikan, atau hanya untuk membuat ini sulit?