Разница между двойным в c # и target-c при преобразовании в строку - PullRequest
0 голосов
/ 03 сентября 2010

Я нахожусь в процессе миграции потрясающей структуры геокода c #

http://code.google.com/p/geocoordconversion/

к объективу-c

однако я заметил небольшую разницу.

В коде есть строка, которая делает следующее:

int retVal = Math.Abs(allAfterDecimal).ToString().Trim('0').Length - 1;

Теперь я написал соответствующие тестовые сценарии, но заметил, что при преобразовании в строку я получаю разные ответы

c # allAfterdeimal.ToString () = "0.5084667"

но в

objc [NSString stringWithFormat: @ "% f", allAfterdecimal] = "0.508467"

оба объявляются как двойные на соответствующем языке

Как я могу обойти эту проблему, поскольку она приводит к провалу моих тестов. Мне нужно, чтобы обе строки представляли один и тот же метод для вычисления значимых цифр

1 Ответ

1 голос
/ 03 сентября 2010

Я предполагаю, что число 8 является опечаткой и должно быть 6. Вы никогда не сможете заставить этот код работать постоянно, как есть, тип double может хранить только 15 значащих цифр.Все, что за пределами, это просто шум.Вам нужно избавиться от цифр шума.

Кроме того, очень маловероятно, что вы получите точно такие же цифры шума при расчете в C # против Objective-C.Они используют FPU по-разному, оставляя промежуточные результаты в FPU в разное время.У этих посредников есть более значимые цифры.

Произвольный способ фильтрации цифр шума:

 int retVal = Math.Abs(allAfterDecimal).ToString("N12").Trim('0').Length - 1;

Спецификатор формата N12 гарантирует, что во фракции может быть только 12 цифр, отсекаяшум.Его «подходящее» значение сильно зависит от величины числа.По сути, этот фрагмент кода имеет недостатки, поскольку предполагает, что тип double не имеет проблем с округлением.Оно делает.Причина номер один, что существует тип decimal .Пока вы застряли с двойным, важно, чтобы вы делали это по-другому.Я не могу догадаться, почему ты это делаешь.

...