2013-03-10 138 views
0

我有一个小数功能:在打印参数C#小数精度功能

public decimal NGD(long TotalPages, long XHits, long YHits, long BothHits) 
{ 
    return ((Math.Max(XHits, YHits)-BothHits)/(TotalPages - Math.Min(XHits, YHits))); 
} 

我得到它转换为return ((36100000 - 3580000)/(44000000000 - 5630000));但在我的应用程序NGD(44000000000,36100000,5630000,3580000)我得到一个0时应该是0.00073918549

回答

2

这是因为您正在使用整数除法来截断结果。使用return ((decimal)(36100000 - 3580000)/((decimal)(44000000000 - 5630000)));进行十进制除法。

+0

请注意,当'(十进制)'强制转换如此放置时,减法仍然使用'long'执行。如果可以保证它不会溢出(这与“long.MinValue”和“long.MaxValue”不同)。但你也可以使用'return((decimal)Math.Max(XHits,YHits) - BothHits)/((decimal)TotalPages - Math.Min(XHits,YHits));'在这种情况下,十进制“减号”。 – 2013-03-10 15:30:52

2

你正在做整数除法,它只能返回一个截断的整数。

您需要将一个操作数转换为非整数类型(可能为decimal)。

+0

是的,他的方法的返回类型是'decimal',所以'double'不是。 – 2013-03-10 15:08:06

0

您所有的运算与longSystem.Int64)做这是一个整数类型。只有分割完成后(给出整数结果),商才会被转换为decimal

考虑将您的股息(或甚至只是它的主要期限)转换为decimalSystem.Decimal)。然后所有其他long值将自动被“提升”为decimal

当然,您可以改为将一个参数(或所有参数)更改为decimal。将不需要显式转换将long类型的表达式转换为decimal类型的方法参数。