C# 中的乘法错误
Multiplication in C# error
当将一组整数相乘并将结果转换为长整数时,我得到的答案与我将一组双精度数相乘并将结果转换为长整数时得到的答案不同。例如:
int a = 5;
int b = 5;
int c = 7;
int d = 6;
int ee = 6;
int f = 8;
int g = 9;
int h = 6;
int i = 6;
int j = 4;
int k = 8;
int l = 9;
int m = 5;
long x = a * b * c * d * ee * f * g * h * i * j * k * l * m;
double aa = 5;
double ab = 5;
double ac = 7;
double ad = 6;
double aee = 6;
double af = 8;
double ag = 9;
double ah = 6;
double ai = 6;
double aj = 4;
double ak = 8;
double al = 9;
double am = 5;
long y = (long)(aa * ab * ac * ad * aee * af * ag * ah * ai * aj * ak * al * am);
谁能告诉我为什么会这样?谢谢
这可能是因为您的乘法结果太大而无法保存在 Int32 中 - 但它可以保存在双精度中。
要更具体一点,请查看十六进制的 x 和 y:
x = 0x000000007994b000
y = 0x000000057994b000
一个Int32
只能保存较低的8个十六进制值。这就是为什么 x
是错误的数字。最低的 8 个十六进制值是正确的,但顶部被截断了。
你有一个 整数溢出 ,因为每当你乘以两个 int
你有 int
:
到目前为止,这被解释为 Int32
a * b * c * d * ee * f * g * h * i * j * k * l * m
并且只比转换成Int64
(long
)。要更正实施,请声明
所有变量最初都是 long
例如
long a = 5;
long b = 5; // actually, not necessary, since a * b will be long, but safer
long c = 7;
...
long m = 5;
long x = a * b * c * d * ee * f * g * h * i * j * k * l * m;
我对它进行了简短的搜索,运行 甚至还对脚本进行了一些测试,我发现了以下结果,
在脚本格式中,我将其测试为,
<script>
var a = 5;
var b = 5;
var c = 7;
var d = 6;
var ee = 6;
var f = 8;
var g = 9;
var h = 6;
var i = 6;
var j = 4;
var k = 8;
var l = 9;
var m = 5;
var x = a * b * c * d * ee * f * g * h * i * j * k * l * m;
var y = eval(a * b * c * d * ee * f * g * h * i * j * k * l * m);
document.writeln("RESULT X : " + x);
document.write("<br>");
document.writeln("RESULT Y : " + y);
</script>
并且 x
和 y
的结果都是 23514624000
,但是在 C# 中,当您尝试将所有整数相乘时,结果形成了一个整数,但我们也知道int.MAX = 2147483647
小于实际结果,因此在分配给 long x= a * b * c * d * ee * f * g * h * i * j * k * l * m;
时的结果中它 t运行 包含原始值,而在其他结果中则不是,如果你想要相同的结果您都可以使用以下代码,
int a = 5;
int b = 5;
int c = 7;
int d = 6;
int ee = 6;
int f = 8;
int g = 9;
int h = 6;
int i = 6;
int j = 4;
int k = 8;
int l = 9;
int m = 5;
long x = (long)a * b * c * d * ee * f * g * h * i * j * k * l * m;
double aa = 5;
double ab = 5;
double ac = 7;
double ad = 6;
double aee = 6;
double af = 8;
double ag = 9;
double ah = 6;
double ai = 6;
double aj = 4;
double ak = 8;
double al = 9;
double am = 5;
long y = (long)(aa * ab * ac * ad * aee * af * ag * ah * ai * aj * ak * al * am);
Console.WriteLine(x);
Console.WriteLine(y);
Console.ReadKey();
现在您将得到相同的结果,即 23514624000
当将一组整数相乘并将结果转换为长整数时,我得到的答案与我将一组双精度数相乘并将结果转换为长整数时得到的答案不同。例如:
int a = 5;
int b = 5;
int c = 7;
int d = 6;
int ee = 6;
int f = 8;
int g = 9;
int h = 6;
int i = 6;
int j = 4;
int k = 8;
int l = 9;
int m = 5;
long x = a * b * c * d * ee * f * g * h * i * j * k * l * m;
double aa = 5;
double ab = 5;
double ac = 7;
double ad = 6;
double aee = 6;
double af = 8;
double ag = 9;
double ah = 6;
double ai = 6;
double aj = 4;
double ak = 8;
double al = 9;
double am = 5;
long y = (long)(aa * ab * ac * ad * aee * af * ag * ah * ai * aj * ak * al * am);
谁能告诉我为什么会这样?谢谢
这可能是因为您的乘法结果太大而无法保存在 Int32 中 - 但它可以保存在双精度中。
要更具体一点,请查看十六进制的 x 和 y:
x = 0x000000007994b000
y = 0x000000057994b000
一个Int32
只能保存较低的8个十六进制值。这就是为什么 x
是错误的数字。最低的 8 个十六进制值是正确的,但顶部被截断了。
你有一个 整数溢出 ,因为每当你乘以两个 int
你有 int
:
到目前为止,这被解释为 Int32
a * b * c * d * ee * f * g * h * i * j * k * l * m
并且只比转换成Int64
(long
)。要更正实施,请声明
所有变量最初都是 long
例如
long a = 5;
long b = 5; // actually, not necessary, since a * b will be long, but safer
long c = 7;
...
long m = 5;
long x = a * b * c * d * ee * f * g * h * i * j * k * l * m;
我对它进行了简短的搜索,运行 甚至还对脚本进行了一些测试,我发现了以下结果, 在脚本格式中,我将其测试为,
<script>
var a = 5;
var b = 5;
var c = 7;
var d = 6;
var ee = 6;
var f = 8;
var g = 9;
var h = 6;
var i = 6;
var j = 4;
var k = 8;
var l = 9;
var m = 5;
var x = a * b * c * d * ee * f * g * h * i * j * k * l * m;
var y = eval(a * b * c * d * ee * f * g * h * i * j * k * l * m);
document.writeln("RESULT X : " + x);
document.write("<br>");
document.writeln("RESULT Y : " + y);
</script>
并且 x
和 y
的结果都是 23514624000
,但是在 C# 中,当您尝试将所有整数相乘时,结果形成了一个整数,但我们也知道int.MAX = 2147483647
小于实际结果,因此在分配给 long x= a * b * c * d * ee * f * g * h * i * j * k * l * m;
时的结果中它 t运行 包含原始值,而在其他结果中则不是,如果你想要相同的结果您都可以使用以下代码,
int a = 5;
int b = 5;
int c = 7;
int d = 6;
int ee = 6;
int f = 8;
int g = 9;
int h = 6;
int i = 6;
int j = 4;
int k = 8;
int l = 9;
int m = 5;
long x = (long)a * b * c * d * ee * f * g * h * i * j * k * l * m;
double aa = 5;
double ab = 5;
double ac = 7;
double ad = 6;
double aee = 6;
double af = 8;
double ag = 9;
double ah = 6;
double ai = 6;
double aj = 4;
double ak = 8;
double al = 9;
double am = 5;
long y = (long)(aa * ab * ac * ad * aee * af * ag * ah * ai * aj * ak * al * am);
Console.WriteLine(x);
Console.WriteLine(y);
Console.ReadKey();
现在您将得到相同的结果,即 23514624000