У меня была задача портировать код C++ на С#. В моем коде была ошибка, сообщенная клиентом. Когда я отлаживал, вот что я получил...
C++ Код:
double d = -0.0000000000018736038338473693;
String temp = String(SimpleRoundTo(d, -12))); // SimpleRoundTo() is from delphi
// temp is having -1E-12
Код С#:
double d = -0.0000000000018736038338473693;
string temp = (Math.Round(d, 12)).ToString();
// temp is having -2E-12
Я проверял перегрузки Math.Round(), не получая, как получить тот же результат.
Ответ, который дает версия C++, просто неверно. Это должно быть очевидно. Ясно, что 2E-12
является правильным ответом, поскольку SimpleRoundTo
, как и Math.Round
, округляется до ближайшего.
Итак, если вы хотите воспроизвести ошибочный вывод версии C++ на С#, вам нужно будет перевести код Delphi RTL на С#. Это потребует разработки именно того, что SimpleRoundTo
и преобразование String()
. Или p/вызвать в DLL C++.
Я хотел бы заняться этим, пытаясь понять, что должен сделать исходный код. Выражайте это математически, а не в терминах функций RTL. После того, как у вас есть четкая спецификация того, что вы намерены использовать для кода, введите код на С#, используя естественные механизмы С#. Другими словами, не пытайтесь выполнить буквальный перевод, потому что, вероятно, не существует. Вместо этого понимайте намерение исходного кода и реализуйте его с нуля в С#.
Глядя на свой код, вы выполняете округление, а затем конвертируете в текст. Я бы искал подход, который выполнял округление как часть преобразования в текст.