как конвертировать двойной в строку? - PullRequest
1 голос
/ 13 октября 2010

Я знаю, что в большинство языков программирования встроены функции, позволяющие вам сделать это, но как эти функции работают?

Ответы [ 5 ]

2 голосов
/ 13 октября 2010

javadoc о методе Double toString () довольно всеобъемлющий:

Создает строковое представление двойного аргумента.Все символы, упомянутые ниже, являются символами ASCII.

  • Если аргумент равен NaN, результатом является строка «NaN».
  • В противном случае результатом является строка, представляющая знак иВеличина (абсолютная величина) аргумента.Если знак отрицательный, первым символом результата является '-' ('-');если знак положительный, знак не появляется в результате.Что касается величины m:
  • Если m - бесконечность, она представлена ​​символами «Бесконечность»;таким образом, положительная бесконечность приводит к результату «Бесконечность», а отрицательная бесконечность дает результат «-Инфинити».
  • Если m равно нулю, он представлен символами «0.0»;таким образом, отрицательный ноль дает результат «-0.0», а положительный ноль дает результат «0.0».
  • Если m больше или равно 10 ^ -3, но меньше 10 ^ 7, то оно представляетсякак целая часть m в десятичной форме без начальных нулей, за которой следует '.'(.), за которым следуют одна или несколько десятичных цифр, представляющих дробную часть числа m.
  • Если m меньше 10 ^ -3 или не меньше 10 ^ 7, то оно представляется в так называемом "компьютеризированная научная запись ".Пусть n - единственное целое число такое, что 10 ^ n <= m <10 ^ (n + 1);тогда пусть a будет математически точным отношением m и 10 ^ n, так что 1 <= a <10.Величина затем представляется как целая часть a, как одна десятичная цифра, за которой следует «.»(.), за которыми следуют десятичные цифры, представляющие дробную часть a, за которыми следует буква «E» (E), за которой следует представление n в виде десятичного целого числа, полученного методом Integer.toString (int). </li>

Сколько цифр должно быть напечатано для дробной части m или a?Должна быть хотя бы одна цифра для представления дробной части, и помимо этого столько, но только столько, сколько цифр необходимо, чтобы однозначно отличить значение аргумента от смежных значений типа double.То есть предположим, что x - это точное математическое значение, представленное десятичным представлением, полученным этим методом для конечного ненулевого аргумента d.Тогда d должно быть двойным значением, ближайшим к x;или если два двойных значения одинаково близки к x, то d должно быть одним из них, а младший значащий бит значенияи d должен быть 0.

Достаточно ли этого?В противном случае вы также можете посмотреть реализацию ...

0 голосов
/ 13 октября 2010

Этот документ Ги Стила содержит подробности о том, как сделать это правильно Это намного тоньше, чем вы думаете.

http://portal.acm.org/citation.cfm?id=93559

0 голосов
/ 13 октября 2010

Как упомянул Одед в комментарии, разные языки будут делать это по-разному. В качестве примера, вот как Ruby 1.9 делает это (в C). Лучше всего в качестве исследовательского упражнения будет посмотреть на языки с открытым исходным кодом и посмотреть, как они это делают.

0 голосов
/ 13 октября 2010

Простой (но не универсальный, наивный и медленный способ):

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

Конечно, есть несколько проблем:

  • медленно, как ад;
  • не делаетне работает для отрицательных чисел;
  • не даст вам экспоненциальную запись для очень маленьких или больших чисел.

В общем, это идея, но не очень хорошая;Я подозреваю, что нет языков программирования, которые делают это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...