如何四舍五入

时间:2018-10-31 21:04:56

标签: c# .net excel excel-vba excel-formula

我有excel提供的逻辑

CONCATENATE(ROUND(slno/256,0),ROUNDUP(((slno /256)-ROUND(slno/256,0))*256,0)) 

并且我将同样地转换为c#。按照逻辑,如果slno是2696709,则答案应该是105345。但是当我使用以下c#代码时,我将其获取为{{1 }},如何更正并获取为10534-2686169 我使用的错误代码如下

105345

3 个答案:

答案 0 :(得分:3)

这是由于操作顺序而发生的。乘以256就是在减去之前。

在代码的这一部分:

Math.Ceiling(((slno / 256) - Math.Round((slno / 256), 0) * 256))

您要先进行减法操作,这可以通过括号进行。

Math.Ceiling((((slno / 256) - Math.Round((slno / 256), 0)) * 256))

我还将考虑在舍入调用上设置一个显式MidpointRounding值,因为默认值(最接近的偶数)通常不是您期望的远离零的值。 例如,=ROUND(2.5,0)产生一个值为3的单元格,Math.Round(2.5, 0)产生一个2的值。

excel公式的完整翻译如下:

decimal slno = 2696709; 
var val = slno / 256;
var valRound = Math.Round(val, 0, MidPointRounding.AwayFromZero);
var result = valRound.ToString() + Math.Ceiling((val - valRound) * 256).ToString();

答案 1 :(得分:2)

我直接替换了您的公式...

  • CONCATENATE => String.Concat
  • ROUND => Math.Round
  • ROUNDUP => Math.Ceiling

我还转而使用AwayFromZero MidpointRounding,因为我相信它是Excel的默认值,而.NET的默认值是ToEven

decimal slno = 2696709;
string result = String.Concat(
        Math.Round(slno/256,MidpointRounding.AwayFromZero),
        Math.Ceiling(((slno /256)-Math.Round(slno/256,MidpointRounding.AwayFromZero))*256)
    );

答案 2 :(得分:1)

那就是答案:

double slno = 2696709;
var result = Math.Round(slno / 256, 0).ToString() + Math.Ceiling(((slno / 256) - Math.Round(slno / 256, 0)) * 256).ToString();