乘法运算的错误结果
本文关键字:错误 结果 运算 | 更新日期: 2023-09-27 18:31:58
我正在尝试在我的应用程序中将两个数字相乘,但在某些情况下会导致错误的值
var result = 0;
var firstNumber = 654165;
var secondNumber = 6541;
result = firstNumber * secondNumber;
它的结果-16074031
哪个是错误的
你能帮我找到错误在哪里吗?
试试这个:
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;
}
查看选中和未选中的关键字。
您的隐式变量都是作为int
创建的,但您的计算结果只能放在一个long
中,因此您会看到溢出错误。
如果只是将result
声明为 long
,您仍然会看到错误的结果,因为该操作是在两个int
上执行的,并且在赋值之前不会转换为 long
,由溢出已经发生的时间。
因此,您需要将一个(或两个)数字声明为long
,或者在计算过程中将一个(或两个!)转换为long
。您还可以省略将0
冗余分配给"结果:
int firstNumber = 654165;
int secondNumber = 6541;
long result = (long)firstNumber * secondNumber;
或:
long firstNumber = 654165;
int secondNumber = 6541;
long result = firstNumber * secondNumber;
你得到一个溢出。
对三个声明使用 long
而不是 var
,它将为您提供正确的结果。
long result = 0;
long firstNumber = 654165;
long secondNumber = 6541;
result = firstNumber * secondNumber;
编译器使用var
将类型Int32
分配给变量。
结果是大于 Int32.MaxValue 的 4,278,893,265
(即 2,147,483,647
)
你有一个溢出。应使用大于 32 位的类型。(例如长,小数点为双倍)
尽管对所有声明都使用 var 但使用 long,那么你将得到正确的输出
结果应为 long
类型
您可以通过更改为 来执行此操作。
var result = 0L;
var firstNumber = 654165L;
var secondNumber = 6541L;
result = firstNumber * secondNumber;
乘法正在创建一个大于 int 的数字并且溢出。