ฉันมีเลขจำนวนเต็มขนาดใหญ่มาก 3 ตัว
long x = long.MaxValue;
long y = long.MaxValue - 1;
long z = long.MaxValue - 2;
ฉันต้องการคำนวณค่าเฉลี่ยที่ถูกตัดทอน คาดว่าค่าเฉลี่ยซึ่งเป็นlong.MaxValue - 1
9223372036854775806
เป็นไปไม่ได้ที่จะคำนวณเป็น:
long avg = (x + y + z) / 3; // 3074457345618258600
หมายเหตุ: ฉันอ่านคำถามเหล่านี้ทั้งหมดเกี่ยวกับค่าเฉลี่ยของตัวเลข 2 ตัว แต่ฉันไม่เห็นว่าเทคนิคนั้นสามารถใช้กับค่าเฉลี่ยของตัวเลข 3 ตัวได้อย่างไร
มันจะง่ายมากกับการใช้งานBigInteger
แต่สมมติว่าฉันไม่สามารถใช้งานได้
BigInteger bx = new BigInteger(x);
BigInteger by = new BigInteger(y);
BigInteger bz = new BigInteger(z);
BigInteger bavg = (bx + by + bz) / 3; // 9223372036854775806
ถ้าฉันแปลงเป็นdouble
แน่นอนฉันสูญเสียความแม่นยำ:
double dx = x;
double dy = y;
double dz = z;
double davg = (dx + dy + dz) / 3; // 9223372036854780000
ถ้าฉันแปลงเป็นdecimal
มันใช้งานได้ แต่สมมติว่าฉันไม่สามารถใช้มันได้
decimal mx = x;
decimal my = y;
decimal mz = z;
decimal mavg = (mx + my + mz) / 3; // 9223372036854775806
คำถาม:มีวิธีคำนวณค่าเฉลี่ยที่ถูกตัดทอนของจำนวนเต็ม 3 จำนวนที่มีขนาดใหญ่มากโดยใช้long
ประเภทหรือไม่? อย่าถือว่าคำถามนั้นเป็น C # - เฉพาะฉันแค่ให้ตัวอย่างใน C # ง่ายกว่า