2015-11-16 4 views
0

Сначала я разделяю целочисленную часть и плавающую часть с плавающим значением с 4 цифрами (например, 5.678) Затем я умножаю плавающую часть на 1000, чтобы получить целое число, а затем поместите это целое число в функцию пола.Matlab/Octave floor (678.0) = 677.0?

x = 5.678 
int_part = floor (x)   % result is 5 
float_part = x - int_part  % result is 0.678 
float_part = float_part * 1000 % result is 678 
floor (float_part)    % returns 677 instead of 678 

Что здесь происходит? Как я могу сказать Matlab/Octave, чтобы вернуть правильное значение?

Thx заранее

+8

Причина заключается в том, что '5.678-5 == 0.678' возвращается '0', т.е. 'false' из-за арифметики с машинной точностью. Попробуйте добавить 'eps' в ваш остаток:' float_part = x-int_part + eps'. Некоторая информация: http://stackoverflow.com/questions/686439/why-is-24-0000-not-equal-to-24-0000-in-matlab –

+0

Показать больше цифр, используя формат 'long g', чтобы увидеть, как' 5.678' хранится. – Matt

ответ

1
x = 5.678 
int_part = floor (x)   % result is 5 
float_part = x - int_part  % result is 0.678 
float_part = float_part * 1000 % result is 678 
floor (float_part)    % returns 677 instead of 678 
format long 
disp(float_part) 

Ответ

6.779999999999999e+02 

Так пол (float_part) является

677 
+0

Поскольку вы добавили ответ, я предлагаю предлагать 'round' вместо' floor'. –