导致int64错误的结果,为什么?

iam*_*doy 1 c# int

我似乎在使用var的算术运算中找不到准确的结果Int64。我需要做的平均值两者的Int64值。

static void Main(string[] args)
{
    Int64 avg
    int testCase = 0;
    testCase = int.Parse(Console.ReadLine());

    for (int i = 0; i < testCase; i++)
    {
        string[] str = Console.ReadLine().Split();

        avg = ( ( Int64.Parse( str[0] ) + Int64.Parse( str[1] ) ) / 2 );

        Console.WriteLine(avg);
    }
}
Run Code Online (Sandbox Code Playgroud)

输入: str[0] == 9082296538332151448 str[1] == 5601337573664003844

输出: -1881554980856698162

为什么产生负数。试图找到平均值

Dmi*_*nko 6

您有整数溢出

9082296538332151448 + 5601337573664003844 > Int64.MaxValue
Run Code Online (Sandbox Code Playgroud)

14683634111996155292 > 9223372036854775807
Run Code Online (Sandbox Code Playgroud)

您可以在这种情况下使用checked关键字抛出异常ArithmeticException)(并知道发生了问题):

avg = checked( ( Int64.Parse( str[0] ) + Int64.Parse( str[1] ) ) / 2 );
Run Code Online (Sandbox Code Playgroud)

如果两个str[0]str[1]保证是等于或小于Int64.MaxValue,你可以把它看成

Int64 arg1 = Int64.Parse(str[0]);
Int64 arg2 = Int64.Parse(str[1]); 

arg = checked(arg1 / 2 + arg2 / 2 + (arg1 % 2 + arg2 % 2) / 2);
Run Code Online (Sandbox Code Playgroud)

一般情况下,可能是这样的:

Int64[] data = ... 

Int64 average = 0;
Int64 rem = 0;

foreach (var item in data) {
  rem     += item % data.Length;
  average += item / data.Length + rem / data.Lenth;
  rem     %= data.Lenth; 
}   

if (rem > data.Length % 2L)
  average += 1;
else if (-rem > data.Length % 2L)
  average -= 1;  
Run Code Online (Sandbox Code Playgroud)

最后,另一种(较慢但通用的)可能性是使用BigIntegers代替Int64

using System.Numerics;

...

avg = (Int64)( ( BigInteger.Parse( str[0] ) + BigInteger.Parse( str[1] ) ) / 2 );
Run Code Online (Sandbox Code Playgroud)