2012-03-17 56 views
0

我很难理解当我将小数转换为长整数的舍入过程。从十进制C舍入诠释#

例如

decimal pi = Convert.ToDecimal(Math.PI); 
long d = 2534254324524352; 
long dpi = Convert.ToInt64(pi * Convert.ToDecimal(d)); 
//I'd like to do the reverse to get the value of d as dd 
long dd = Convert.ToInt64(Convert.ToDecimal(dpi) /pi); 

在这个特殊的例子它的工作原理,但有时当我尝试去多少回它不工作。当你将小数转换为长整数时,有一个确切的方法是圆整的?有没有办法控制这种行为?

由于

+5

“它不工作” 是不是真的有帮助。请找到一个简短但完整的例子,说明预期的行为和实际行为。 – 2012-03-17 19:53:18

回答

3

Convert.ToInt64,最喜欢的缺省转换方法,用途banker's rounding,即舍入到最近的2的倍数。 Here's a demo - 无论是6.5和5.5四舍五入至6

Console.WriteLine("Rounding 5.5 to {0}", Convert.ToInt64(5.5D)); // 6 
Console.WriteLine("Rounding 6.5 to {0}", Convert.ToInt64(6.5D)); // 6 

您可以通过使用一个decimalMath.FloorMath.Ceil将其转换为longas seen here之前更改此行为。 Math.Floor可能是您需要的。

Console.WriteLine("Rounding 5.5 to {0}", Convert.ToInt64(Math.Floor(5.5D))); // 5 
Console.WriteLine("Rounding 6.5 to {0}", Convert.ToInt64(Math.Floor(6.5D))); // 6 

所以:

decimal pi = Convert.ToDecimal(Math.PI); 
long d = 2534254324524352; 
long dpi = Convert.ToInt64(Math.Floor(pi * Convert.ToDecimal(d))); 
long dd = Convert.ToInt64(Math.Floor(Convert.ToDecimal(dpi)/pi)); 
+0

史诗般的答案!谢谢 – 2012-03-17 20:04:30