为什么输出“0 和 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
为什么输出“0 和 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 的值转换为 a long
。这将截断值,0
因此乘法也会导致 0
Console.WriteLine((long)0.25); // 0
Console.WriteLine((long)0.75); // 0
因为 0.25 和 0.75 铸成的 long 都是 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
which is之前0
。