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
语句(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}"
文字,它只是一种格式,可以给输出一些视觉美感。默认情况下,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
。