Как мы можем разделить число с плавающей запятой на целые и десятичные части? - PullRequest
0 голосов
/ 15 октября 2019

Я хочу определить числа с плавающей запятой и целые числа, такие как 235.102457.

Короче говоря, хочу сохранить две части моего числа, например:

A=235
B=102457

Как разделитьэтот номер?

Ответы [ 4 ]

7 голосов
/ 15 октября 2019
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 в этом случае терпит неудачу (исключая магию округления, которая каким-то образом умудряется округлять без удаления требуемых десятичных разрядов).

2 голосов
/ 15 октября 2019

Я думаю, что это будет работать (проверено только в октаве):

x = 235.102457
A = floor(x)
B = mod(x,1)
1 голос
/ 15 октября 2019

Это должно работать даже с отрицательными числами:

nDecimalDigit = 9 ;

A = fix( x ) ;
B = round( abs(x-A) * 10^nDecimalDigit ) ;

Функция fix() округляет до нуля, что возвращает одну и ту же неотъемлемую часть числа, независимо от того, отрицательно оно илиположительный (в отличие от floor или ceil, которые округляются соответственно к минус бесконечности и плюс бесконечность).

Поскольку A сохранил знак исходного ввода, я думаю, вам не нужен знак, чтобыв десятичной части B, поэтому мы используем abs() для отмены знака.

Мы умножаем это десятичное число на коэффициент, зависящий от количества цифр, которое вы хотите сохранить, затем делаем окончательное округлениеобрезать десятичную часть, оставшуюся в числе.

0 голосов
/ 15 октября 2019

допустим, вы хотите сохранить 6 десятичных знаков, тогда вы можете сделать это:

x = rand * 1000;
dec = 6;
A = round(x);
B = round((x-A)*10^dec);
...