我试图在我的应用程序中乘以两个数字但在某些情况下会导致错误的值
var result = 0;
var firstNumber = 654165;
var secondNumber = 6541;
result = firstNumber * secondNumber;
结果-16074031
错误
答案 0 :(得分:5)
试试这个:
checked
{
var result = 0;
var firstNumber = 654165;
var secondNumber = 6541;
result = firstNumber * secondNumber;
}
通过这种方式,您可以看到问题System.OverflowException
。要解决只需使用long
unchecked
{
var result = 0L;
var firstNumber = 654165L;
var secondNumber = 6541L;
result = firstNumber * secondNumber;
}
答案 1 :(得分:4)
您的隐式类型变量都是int
创建的,但计算结果只适合long
,因此您会看到溢出错误。
如果您只是将result
声明为long
,您仍会看到错误的结果,因为操作是在两个int
上执行的,而不是转换为long
直到任务,由
溢出已经发生的时间。
因此,您需要在计算过程中将一个(或两个)数字声明为long
,或者将一个(或两个!)强制转换为long
。您也可以省略0
到`result:
int firstNumber = 654165;
int secondNumber = 6541;
long result = (long)firstNumber * secondNumber;
或:
long firstNumber = 654165;
int secondNumber = 6541;
long result = firstNumber * secondNumber;
答案 2 :(得分:1)
你得到了溢出。
使用long
代替var
进行三次声明,它会为您提供正确的结果。
long result = 0;
long firstNumber = 654165;
long secondNumber = 6541;
result = firstNumber * secondNumber;
使用var
编译器将类型Int32
分配给变量。
结果为4,278,893,265
,大于Int32.MaxValue(2,147,483,647
)
答案 3 :(得分:1)
你有溢出。您应该使用大于32位的类型。 (例如,小数加倍)
答案 4 :(得分:0)
尽管对所有声明都使用了var,但是使用long,那么你将得到正确的输出
答案 5 :(得分:0)
结果应为long
您可以通过更改为。
来执行此操作var result = 0L;
var firstNumber = 654165L;
var secondNumber = 6541L;
result = firstNumber * secondNumber;
乘法是创建一个大于int的数字并且溢出。