【问题标题】:Rounding Int from Decimal C#从十进制 C# 舍入 Int
【发布时间】:2012-03-17 19:50:26
【问题描述】:

当我将小数转换为长整数时,我很难理解四舍五入的过程。

例如

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);

在这个特定的示例中,它可以工作,但有时当我尝试重新编号时,它不起作用。当您将小数转换为长整数时,是否有精确的舍入方式?有没有办法控制这种行为?

谢谢

【问题讨论】:

  • “它不起作用”并没有真正的帮助。请找到一个简短但完整的示例,该示例确实说明了问题,说明了预期行为和实际行为。

标签: c# decimal rounding long-integer division


【解决方案1】:

Convert.ToInt64,与大多数默认转换方法一样,使用banker's rounding,即四舍五入到最接近的二的倍数。 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

在将其转换为 longas seen here 之前,您可以在 decimal 上使用 Math.FloorMath.Ceil 来更改此行为。 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));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    • 2016-12-19
    相关资源
    最近更新 更多