C# Int64算术错误
为什么输出为“0和0”?我怎么修理它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的别
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
返回什么?