2013-05-13 145 views
6

給定變量x = 12.3442在MATLAB中查找變量的小數位數

我想知道變量的小數位數。在這種情況下,結果將是4.我如何在沒有反覆試驗的情況下做到這一點?

+6

你不能 - 實數幾乎總是表示爲浮點數針對「小數位數」無厘頭。 – 2013-05-13 17:18:33

+3

@ H2CO3當然這是有道理的。是的,浮點表示的近似性質引發了一個問題。解決這個問題是問題的一部分。將該二進制表示轉換爲十進制(每次在屏幕上打印一個數字時都會發生這種情況......),並計算在計算剩餘的非零值之前需要從結尾刪除多少位數。每當你用浮點數進行算術運算時,你都會失去一些精確度,所以你可以說在計算機上做算術運算是不可能的 - 這不是很有成效的想法,是嗎? – Szabolcs 2013-05-13 17:54:30

+0

@Szabolcs不​​,我不是這樣說的。可能你不明白這個問題,但是浮點計算並不準確,並且其結果是表示依賴的。用戶總是需要指定他想要處理的精度 - 這並不是隱含的。 – 2013-05-13 18:15:17

回答

3

正如在評論中提到的,不會使在大多數情況下的意義,但我認爲這可能是你要尋找的「小數位數」:

>> num = 1.23400; 
>> temp = regexp(num2str(num),'\.','split') 

temp = 

    '1' '234' 
>> length(temp{2}) 

ans = 

    3 
+1

似乎不能工作超過4位十進制數字:Try:'num = 1.23456789;'它給你'ans = 4',最多4位十進制數字。 – 2013-05-14 08:10:58

+2

是的。像'temp = regexp(num2str(num,15),'\。','split')'這樣的東西確實有效,但這並不總是。我很樂意學習更好的東西。 – 2013-05-14 08:37:41

+0

我不知道num2str的第二個輸入。雖然不是防彈的,但我相信在這種情況下絕對可以達到它的目的。 – 2013-05-14 08:52:17

5

這裏是一個緊湊方法:

y = x.*10.^(1:20) 
find(y==round(y),1) 

假設條件是,x是你的號碼,20是小數位的最大數量。

0
%If number is less than zero, we need to work with absolute value 
if(value < 0) 
    num = abs(value); 
else 
    num = value; 
end 
d = 0; % no of places after decimal initialised to 0. 
x = floor(num); 
diff = num - x; 
while(diff > 0) 
    d = d + 1; 
    num = num * 10; 
    x = floor(num); 
    diff = num - x; 
end 

%d is the required digits after decimal point  
0

對於一些a並假定這將有不少於28位小數這裏是一些緊湊和可靠:

numDP = length(num2str(a, 28)) - strfind(num2str(a, 28),'.'); 

轉換爲字符串,使良好的使用字符串比較函數在Matlab雖然它有點笨拙。

0

所有條件下工作(如果它是十進制):

temp = strsplit(num2str(num),'.'); 
result = length(temp{2});