2013-10-01 3 views
1

Существует строка, содержащая число в произвольном формате (например, 12, -34.5 и 6.78e-9). Цель состоит в том, чтобы преобразовать эту строку в соответствующее число и затем преобразовать это число обратно в строку, такую, что (а) точность, указанная в исходной строке, сохраняется, и (b) результирующая строка имеет соответствующий формат (возможно, наиболее подходящим форматом является формат исходной строки). Я думал, что проблему можно легко решить, используя str2num и num2str; однако, в некоторых случаях, MATLAB, как представляется, коверкая конечный результат, как показано ниже:MATLAB: Преобразование строки в число, а затем обратно в строку

>> a = '1e23' 

    a = 

    1e23 

    >> b = str2num(a) 

    b = 

     1.0000e+23 

    >> c = num2str(b) 

    c = 

    9.999999999999999e+22 

Одно из решений состоит в использовании общего строку формата:

>> c = num2str(b, '%e') 

    c = 

    1.000000e+23 

Однако в этом случае выходной выглядит довольно громоздко для количества мелких заказов:

>> d = num2str(1, '%e') 

    d = 

    1.000000e+00 

в большинстве случаев, num2str без дополнительных параметров делает очень хорошую работу, что приводит к отформатированной строке. Возникает вопрос: есть ли способ устранить проблему 9.999999999999999e+22?

Спасибо!

С уважением, Иван

+0

@ Натан, спасибо за ответ. Я знаю о проблемах, связанных с арифметикой FP. – Ivan

+1

могу спросить, в чем смысл? вы можете сохранить как строку, так и номер в любом случае ... – bla

+0

Суть заключается в том, чтобы получить удобную для пользователя строку, сохраняющую оригинальную точность и без необходимости писать кучу специальных решений, ориентированных на конкретные ситуации. – Ivan

ответ

2

В целом представление одной входной строки не содержит достаточно информации, чтобы определить формат. Следовательно (если вы хотите выводить несколько разные числа и не можете просто сохранить номер в строковом формате), самым простым способом было бы попытаться найти нужный формат.

Судя по вашим комментариям, я думаю, вы будете довольны:

format short g 

Для больших чисел это даст:

x = num2str(1.0000e+23);str2num(x) 

ans = 

     1e+23 

И для малых чисел:

x = num2str(1);str2num(x) 

ans = 

    1 
+0

предполагает, что вы просто хотите представить число так. Если вы действительно хотите различное строковое содержимое, попробуйте это: 'x = num2str (1e20, '% g')' –

+0

Кажется 'num2str (..., '% g')' делает именно то, что я хочу. Большое спасибо! – Ivan

Смежные вопросы