Округление значений с плавающей точкой

0

У меня была задача портировать код 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(), не получая, как получить тот же результат.

  • 2
    В любом случае Double имеет точность 16 цифр. Разве вы не должны использовать десятичный тип?
  • 0
    Не является ли результат C # правильным? Например, я ожидаю Math.Round (0,18, 1) == 0,2. Или вы хотите округлить его?
Показать ещё 4 комментария
Теги:
floating-point

1 ответ

4
Лучший ответ

Ответ, который дает версия C++, просто неверно. Это должно быть очевидно. Ясно, что 2E-12 является правильным ответом, поскольку SimpleRoundTo, как и Math.Round, округляется до ближайшего.

Итак, если вы хотите воспроизвести ошибочный вывод версии C++ на С#, вам нужно будет перевести код Delphi RTL на С#. Это потребует разработки именно того, что SimpleRoundTo и преобразование String(). Или p/вызвать в DLL C++.

Я хотел бы заняться этим, пытаясь понять, что должен сделать исходный код. Выражайте это математически, а не в терминах функций RTL. После того, как у вас есть четкая спецификация того, что вы намерены использовать для кода, введите код на С#, используя естественные механизмы С#. Другими словами, не пытайтесь выполнить буквальный перевод, потому что, вероятно, не существует. Вместо этого понимайте намерение исходного кода и реализуйте его с нуля в С#.

Глядя на свой код, вы выполняете округление, а затем конвертируете в текст. Я бы искал подход, который выполнял округление как часть преобразования в текст.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню