乘法运算的错误结果

本文关键字:错误 结果 运算 | 更新日期: 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 的数字并且溢出。