Int64算术错误

本文关键字:错误 Int64 | 更新日期: 2023-09-27 18:07:19

为什么输出是"0 and 0"?我怎么修理它?

 Int64 small=  (long)0.25 * (long)Int64.MaxValue;
 Int64 large = (long)0.75 * (long)Int64.MaxValue;
 System.Console.WriteLine(small + " and " + large);
 System.Console.ReadLine(); 
 //output 
 //0 and 0 

Int64算术错误

语句(long)0.75将返回0(将double转换为long将取最大的整数值,该值小于double转换)。所以有0 * 9223372036854775807,也就是0。顺便说一下,longInt64的别名,这意味着它们是相同的底层类型,因此通过(long)Int64.MaxValuelong转换为long

修复它只需使用double * long乘法

long small=  (long)(0.25 * long.MaxValue);
long large = (long)(0.75 * long.MaxValue);
Console.WriteLine ("{0:N}", small); //print 2,305,843,009,213,693,952.00
Console.WriteLine ("{0:N}", large); //print 6,917,529,027,641,081,856.00

不要使用"{0:N}"文字,它只是一种格式,可以给输出一些视觉美感。默认情况下,double以科学记数法打印,这不是很容易演示(例如,第一次操作是2.30584300921369E+18)

原因是,在这两种情况下,您都在将小于1的值转换为long。这将截断值为0,因此乘法也会得到0

Console.WriteLine((long)0.25);  // 0
Console.WriteLine((long)0.75);  // 0

因为0.25和0.75的长度都是0。

为了解决这个问题,你需要使用浮点数或双精度数。然而,我不能100%确定精度足以导致确切的结果:

Int64 small=  (Int64)(0.25 * (double)Int64.MaxValue);
Int64 large = (Int64)(0.75 * (double)Int64.MaxValue);

您希望在乘法之后而不是之前进行转换。试着

 Int64 small=  (long) (0.25 * (double) Int64.MaxValue);

在您将.25转换为long之前,即0