Это происходит из-за порядка операций. Ваше умножение на 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();