Предположим, я хочу преобразовать число 0.011124325465476454
в строку в MATLAB.Преобразование числа в строку в MATLAB
Если я ударил
mat2str(0.011124325465476454,100)
я 0.011124325465476453
, отличающуюся в последней цифре.
Если я ударил num2str(0.011124325465476454,'%5.25f')
Я получаю 0.0111243254654764530000000
, которая дополняется с нежелательными нулями и отличающуюся в последней цифре (3 должно быть 4).
Мне нужен способ преобразования чисел со случайным числом десятичных знаков в соответствие их точной строке (без нулей, без изменения окончательной цифры).
Есть ли способ?
EDIT: Поскольку я не имею в виду информацию о точности, которую предоставляют Amro и nrz, я добавляю дополнительную дополнительную информацию о проблеме. Цифры, которые мне действительно нужно преобразовать, поступают из программы на C++, которая выводит их в txt-файл, и все они имеют тип C++ double
. [ПРИМЕЧАНИЕ. Часть, которая вводит числа из файла txt в MATLAB, не кодируется мной, и мне на самом деле не разрешено изменять ее, чтобы сохранить числа в виде строк без преобразования их в числовые значения. У меня есть доступ к «выходному» этому коду, который представляет собой число, которое я хотел бы преобразовать]. До сих пор я не получал номера с более чем 17 десятичными знаками (ПРИМЕЧАНИЕ: следовательно, приведенный выше пример с 18 десятичными знаками не очень показательен).
Теперь, если число имеет 15 цифр, например 0.280783055069002
затем num2str(0.280783055069002,'%5.17f')
или mat2str(0.280783055069002,17)
возвращает
0.28078305506900197
, который не является точным числом (см последних цифр).
Но если я ударил mat2str(0.280783055069002,15)
я
0.280783055069002
который правильно !!!
Возможно, существует миллион способов «кодирования» проблемы (например, создать процедуру, которая выполняет преобразование), но нет способа использовать стандартный встроенный MATLAB для получения желаемых результатов при вводе числа со случайным числом десятичных знаков (но не более 17);
@niels - Но вы просто не можете достичь требуемой точности, не используя инструмент, который позволяет работать с большей точностью. Как много, вам нужно признать, что использование числовой формы с плавающей запятой (которая является тем, что удваивается) всегда будет оставлять эту наименее значимую цифру под угрозой. Другим достоинством такой формы, как HPF, является то, что она десятичная. Таким образом, цифры сохраняются в десятичной форме, а не в двоичной форме. –
@niels - Да, это ПОЛНОСТЬЮ относительно точности и того, как число хранится как двоичное число в двойном. До тех пор, пока вы не поймете, что 0.280783054 НЕ представляется в виде числа с плавающей запятой BINARY точно, вы никогда не сможете решить эту проблему. –
MATLAB сохраняет все числа как двойные по умолчанию, поэтому 52 бинарных бита для мантиссы. Если бы вы использовали сингл для хранения номера, то x = single (0.280783054); вы получите: sprintf ('%. 30f', x) ans = 0.280783057212829589843750000000 –