C# Int64算术错误

C# Int64算术错误,c#,largenumber,C#,Largenumber,为什么输出为“0和0”?我怎么修理它 Int64小=(长)0.25*(长)Int64.MaxValue; Int64大=(长)0.75*(长)Int64.MaxValue; 系统控制台写入线(小+”和“+大); System.Console.ReadLine(); //输出 //0和0 语句(long)0.75将返回0(将double转换为long将采用最大整数值,该整数值低于转换double)。所以你有了0*9223372036854775807,希望是0。顺便说一句,long是Int64的别

为什么输出为“0和0”?我怎么修理它

Int64小=(长)0.25*(长)Int64.MaxValue;
Int64大=(长)0.75*(长)Int64.MaxValue;
系统控制台写入线(小+”和“+大);
System.Console.ReadLine();
//输出
//0和0
语句
(long)0.75
将返回0(将double转换为long将采用最大整数值,该整数值低于转换double)。所以你有了
0*9223372036854775807
,希望是
0
。顺便说一句,
long
Int64
的别名,这意味着它们是相同的底层类型,因此通过
(long)Int64.MaxValue
可以将
long
转换为
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}”
literal,它只是一种给输出一些视觉美感的格式。默认情况下,double是以科学记数法打印的,这不是很明显(例如第一次操作
2.30584300921369E+18

原因是,在这两种情况下,您都在将小于1的值转换为
长的
。这将把值截断为
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

-1,不费吹灰之力。这很容易通过尝试解决,您希望这
(long)0.25
返回什么?