Tôi có 3 số nguyên có dấu rất lớn.
long x = long.MaxValue;
long y = long.MaxValue - 1;
long z = long.MaxValue - 2;
Tôi muốn tính toán trung bình cắt ngắn của họ. Giá trị trung bình mong đợi là long.MaxValue - 1
, là 9223372036854775806
.
Không thể tính nó là:
long avg = (x + y + z) / 3; // 3074457345618258600
Lưu ý: Tôi đã đọc tất cả những câu hỏi đó về trung bình của 2 số, nhưng tôi không thấy kỹ thuật đó có thể áp dụng cho trung bình của 3 số như thế nào.
Nó sẽ rất dễ dàng với việc sử dụng BigInteger
, nhưng hãy giả sử tôi không thể sử dụng nó.
BigInteger bx = new BigInteger(x);
BigInteger by = new BigInteger(y);
BigInteger bz = new BigInteger(z);
BigInteger bavg = (bx + by + bz) / 3; // 9223372036854775806
Nếu tôi chuyển đổi thành double
, tất nhiên, tôi sẽ mất độ chính xác:
double dx = x;
double dy = y;
double dz = z;
double davg = (dx + dy + dz) / 3; // 9223372036854780000
Nếu tôi chuyển đổi thành decimal
, nó hoạt động, nhưng cũng giả sử rằng tôi không thể sử dụng nó.
decimal mx = x;
decimal my = y;
decimal mz = z;
decimal mavg = (mx + my + mz) / 3; // 9223372036854775806
Câu hỏi: Có cách nào để tính trung bình bị cắt ngắn của 3 số nguyên rất lớn chỉ với việc sử dụng long
kiểu không? Đừng coi câu hỏi đó là C # cụ thể, chỉ cần tôi cung cấp mẫu trong C # sẽ dễ dàng hơn.
long.MinValue
và long.MaxValue
giữa các giá trị.
BigInteger
hoặc decimal
bị loại trừ, hay chỉ vì mục đích khó khăn?