-5

为什么输出“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 
4

4 回答 4

3

语句(long)0.75将返回 0(将 double 转换为 long 将采用最大的整数值,即低于转换 double 的值)。所以你有0 * 9223372036854775807希望0。顺便说一句,long是别名Int64,这意味着它们是相同的底层类型,所以(long)Int64.MaxValue你可以转换longlong

修复它只需使用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对于第一次操作)

于 2013-04-02T22:09:31.147 回答
0

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

Console.WriteLine((long)0.25);  // 0
Console.WriteLine((long)0.75);  // 0
于 2013-04-02T22:09:38.397 回答
0

因为 0.25 和 0.75 铸成的 long 都是 0。

为了解决这个问题,您需要使用浮点数或双精度数。但是,我不能 100% 确定精度是否足以得出准确的结果:

Int64 small=  (Int64)(0.25 * (double)Int64.MaxValue);
Int64 large = (Int64)(0.75 * (double)Int64.MaxValue);
于 2013-04-02T22:09:45.180 回答
0

你想在乘法之后而不是之前进行转换。尝试

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

在您转换.25longwhich is之前0

于 2013-04-02T22:12:05.403 回答