Из какого источника вы получаете эти цифры? И значимы ли все эти цифры? Числа вашего примера уже превышают относительную точность числового типа double
. Функция eps
сообщит вам, сколько вы получаете округления.
>> sprintf('%.20f', 12345.6788993442355456789)
ans =
12345.67889934423500000000
>> eps(12345.6788993442355456789)
ans =
1.818989403545857e-012
>> sprintf('%.20f', 23432.23432345678911111111111100998)
ans =
23432.23432345678900000000
>> eps(23432.23432345678911111111111100998)
ans =
3.637978807091713e-012
Когда вы вводите число в исходный код Matlab, оно обрабатывается как литерал типа double
. Многие из этих цифр теряются, как только вы их вводите. См. Этот вопрос для дальнейшего обсуждения: В MATLAB переменные ДЕЙСТВИТЕЛЬНО имеют двойную точность по умолчанию? .
Если вы действительно хотите сохранить все эти цифры, вы должны избегать их хранения в первую очередь. Начните с полного числа в строке, а затем проанализируйте его.
function out = parseLongDecimal(str)
ixDot = find(str == '.');
if isempty(ixDot)
out.whole = arrayfun(@str2double, str);
out.fraction = [];
else
out.whole = arrayfun(@str2double, str(1:ixDot-1));
out.fraction = arrayfun(@str2double, str(ixDot+1:end));
end
Это сохранит все цифры.
>> xAsStr = '23432.23432345678911111111111100998'; % as a string literal, not numeric
>> parseLongDecimal(xAsStr)
ans =
whole: [2 3 4 3 2]
fraction: [2 3 4 3 2 3 4 5 6 7 8 9 1 1 1 1 1 1 1 1 1 1 1 1 0 0 9 9 8]
В зависимости от вашего варианта использования вы также можете просто добавить его в объект Java BigDecimal и работать с ним там.
>> jx = java.math.BigDecimal(xAsStr)
jx =
23432.23432345678911111111111100998