两个大数的区别C#对于小数,这个问题已经有了解决方法:我总结一下大家的答案:数学。Abs(a-b)的问题在于,当数字很大时,这会给出错误的答案(通过溢出)。更糟糕的是,如果(a-b)=Int32.MinValue那么Math.Abs??会异常崩溃(因为Int32.MaxValue=Int32.MinValue-1):发生System.OverflowExceptionHResult=0x80131516Message=Negativetwo'scomplementInvalidminimumvalue对于码数。Source=mscorlibprogramStackTrace:AtSystem.Math.Abs??Helper(Int32value)atSystem.Math.Abs??(Int32value)它的特殊性质导致难以重现错误。也许我遗漏了一些众所周知的库函数,但有没有办法安全地确定差异?正如其他人所建议的那样,使用System.Numerics中定义的BigInteger(您必须在VisualStudio中包含命名空间)然后您可以执行以下操作:BigIntegera=newBigInteger();BigIntegerb=newBigInteger();//在这里给a和b赋值...//然后只需要使用包含的BigInteger.Abs方法BigIntegerresult=BigInteger.Abs(a-b);JeremyThompson的回答仍然有效,但请注意BigInteger命名空间包含绝对值方法,因此不需要特殊逻辑。另外,Math.Abs??需要一个小数,所以如果你试图传入一个BigInteger,它会让你很伤心。请记住,使用BigIntegers时需要小心。如果数字非常大,C#将尝试为其分配内存,您可能会遇到内存不足异常。另一方面,BigIntegers很棒,因为分配给它们的内存量会随着数量的增加而动态变化。查看Microsoft参考以获取详细信息:https://msdn.microsoft.com/en-us/library/system.numerics.biginteger(v=vs.110).aspx.Net4.0中引入了BigInteger。.NetFramework的低版本中有一些开源实现,但您应该明智地选择标准。如果Math.Abs??仍然让你感到悲伤,你可以自己实现这个;如果数字是负数(a-b<0),只需修剪负号使其无符号。另外,您是否尝试过使用双打?它们具有更大的价值。问题是,你想如何保持两个大数之间的差异?例如,如果您计算两个有符号长整型(64位)整数之间的差异,而该差异不适合有符号长整型,您将如何存储它?longa=+(1a和b之间的差异大于64位,所以当它存储到long时,它的高位被截断,你得到一个奇怪的值。换句话说,你不能转换给定的All宽度的有符号整数值之间的可能差异存储为相同宽度的有符号整数。(您只能存储所有可能值的一半;另一半需要额外的位。)您可以选择使用更宽的类型来保持差异(如果您已经在使用最宽的长整数类型,这对您没有帮助),或者使用不同的算术类型。如果您需要至少64位带符号的精度,您可能想要使用BigInteger。这是给你的替代方案这可能很有趣,但它非常适合特定int大小的范围。此示例使用Int32,并使用按位运算符求差,然后使用绝对值。此实现可以容忍a-b为等于minint值,它自然会返回minint值(如果不将事物转换为更大的数据类型,您无能为力)。我认为这不如使用BigInteger好,但如果没有别的,玩起来很有趣:staticintdiff(inta,intb){intxorResult=(a^b);intdiff=(a&xorResult)-(b&xorResult);返回(差异+(差异>>31))^(差异>>31);下面是我运行的一些例子:如果C#分享的所有内容对你有用,需要进一步了解C#学习教程,希望你多多关注---Console.WriteLine(diff(13,14));//1Console.WriteLine(diff(11,9));//2Console.WriteLine(diff(5002000,2346728));//2655272Console.WriteLine(diff(int.MinValue,0));//应该是2147483648,但是int数据类型不能那么大。实际结果将为-2147483648。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
