Как узнать, безопасна ли двойная строка в оба конца?

У меня есть текстовое представление двойника, и я хочу знать, безопасно ли совершать круговые поездки, чтобы удвоить и обратно. Как мне узнать об этом, если я также хочу принять любой вид числового стиля ввода? Или как узнать, теряется ли какая-либо точность при анализе двойной строки с помощью Double.Parse? Или как мне ToString удвоить, чтобы он соответствовал тому же формату, что и другая двойная строка? Ответ на любой из этих вопросов был бы решением, я думаю.


person Andreas Zita    schedule 22.08.2012    source источник
comment
Что вы уже пробовали? Может быть какие-то тесты?   -  person Serg Rogovtsev    schedule 22.08.2012
comment
Что вы подразумеваете под соответствием тому же формату, что и другая двойная строка? У вас указан этот формат или нет? т.е. Настоящим я предоставляю вам эту строку: 123sd344+334.ere и утверждаю, что это правильно отформатированное двойное число. Как вы догадываетесь, что это за формат?   -  person quetzalcoatl    schedule 22.08.2012
comment
Хммм. Я думаю об ограничении количества значащих цифр и показателя степени чем-то, чтобы я мог гарантировать, что любое число, записанное в формате #.#E#, безопасно для приема и передачи.   -  person Andreas Zita    schedule 22.08.2012


Ответы (2)


Используйте спецификатор формата R, чтобы преобразовать double в string:

myDouble.ToString("R")

См. Описатель формата "R" на MSDN.

Описатель формата туда и обратно ("R") гарантирует, что числовое значение, преобразованное в строку, будет преобразовано обратно в то же числовое значение. Этот формат поддерживается только для типов Single, Double и BigInteger.

(выделено мной)

person Oded    schedule 22.08.2012
comment
Это применимо к double -> string -> double, но не помогает в случае string -> double -> string. - person JohnB; 22.08.2012
comment
@JohnB - это полностью зависит от исходного представления double в виде строки. Для начала нужно предположить непротиворечивое представление. - person Oded; 22.08.2012
comment
Преобразователь R не надежен. См. stackoverflow.com/questions/24299692/ для получения дополнительной информации. - person supercat; 06.07.2014

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

  1. Формат числа теряется при синтаксическом анализе String на двойник, так как двойник не содержит никакой информации о его визуальном представлении.

  2. Хотя строковое представление обычно будет десятичным, double — это двоичное число с плавающей запятой. Таким образом, 0,1 в double не будет точно 0,1, поскольку двоичное представление 0,1 не имеет конечного числа цифр. Чтобы избежать этой проблемы, вы можете разобрать десятичное число вместо двойного.

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

person JohnB    schedule 22.08.2012