x=235.102457;
tmp = strsplit(num2str(x,16),'.'); % Cast to string, split on the dot
A = str2num(tmp{1}); % = 235
B = str2num(tmp{2}); % = 102457
Это можно сделать, преобразовав число в строку с помощью num2str()
, разделив точку с помощью strsplit()
, а затем преобразовав каждую часть обратно в двойныеиспользование str2num()
.
Обратите внимание на 16
в вызове num2str
: по умолчанию в строку помещается только 4 десятичных знака. По сути, подойдет любое достаточно высокое число, если десятичная часть вашего числа меньше этой. Установка этого значения может увеличить время выполнения.
Выполнить это численно сложно. Задание количества десятичных разрядов и последующее округление, как и другие ответы, работают, но имеют недостаток, заключающийся в том, что, например, 1.1, 1.0, 1.100
и т. Д. Обрабатываются одинаково. Попытка найти мощность рекурсивно не работает из-за числовой точности:
x = 235.102457;
A = fix(x);
tmp = x-A;
tmp*10^6
ans =
1.024569999999869e+05 % i.e. needs rounding
kk = 0;
while kk<32 && ~(mod(tmp,1)==0)
tmp = tmp*10;
kk = kk+1;
end
tmp
tmp =
1.024569999999869e+16 % Gets a lot of floating point garbage
Внутри цикла нет способа узнать, когда округлить значение, таким образом, пытаясь рекурсивно найти количество значащих цифр,kk
в этом случае терпит неудачу (исключая магию округления, которая каким-то образом умудряется округлять без удаления требуемых десятичных разрядов).