我有excel提供的逻辑
CONCATENATE(ROUND(slno/256,0),ROUNDUP(((slno /256)-ROUND(slno/256,0))*256,0))
并且我将同样地转换为c#。按照逻辑,如果slno是2696709
,则答案应该是105345
。但是当我使用以下c#代码时,我将其获取为{{1 }},如何更正并获取为10534-2686169
我使用的错误代码如下
105345
答案 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)
我直接替换了您的公式...
我还转而使用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();