Как округлить число - PullRequest
       1

Как округлить число

0 голосов
/ 01 ноября 2018

У меня есть логика от Excel как

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

и я преобразовываю в c # то же самое. Согласно логике, если slno равен 2696709, тогда ответ должен быть 105345. Но когда я использую следующий код C #, я получаю его как 10534-2686169, как исправить и получите это как 105345 Неверный код, который я использовал, как показано ниже

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

Ответы [ 3 ]

0 голосов
/ 01 ноября 2018

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

Вот ответ:

double slno = 2696709;
var result = Math.Round(slno / 256, 0).ToString() + Math.Ceiling(((slno / 256) - Math.Round(slno / 256, 0)) * 256).ToString();
0 голосов
/ 01 ноября 2018

Я сделал прямую замену вашей формулы ...

  • 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)
    );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...