2011-12-02 60 views
0

在MATLAB我想這個轉換:轉換十進制數到矢量

12345.6788993442355456789 

爲載體

[1 2 3 4 5 6 7 8 8 9 9 3 4 4 2 3 5 5 4 5 6 7 8 9] 

我已經發現了幾個解決方案,以一個整數轉換成使用像scanf, num2str,...命令的載體,但那些不適合與非整數,並且一些解決方案有數字與大數小數位的問題...

這種轉換是需要的,因爲我希望看到並使用該號碼的所有數字。

+0

我會把這個數字看作一個字符串,刪除所有'''',然後使用你說的工作代碼。 – Blender

+0

@Virginia:如果你的意思是你需要在計算中使用所有的數字,那麼不用擔心,即使默認情況下它們不會被顯示,Matlab也會使用它們(儘管'format long'會改變它)。 – Jonas

+1

@Jonas:不,她的例子中有太多的數字在「雙」中「合適」;一旦轉化,一些人就會失去平衡。 –

回答

0

不熟悉Matlab的語法,但如果你

  • 轉換爲數字爲字符串
  • 遍歷每個字符和數字添加到矢量如果字符是不是小數點

這將工作。有可能更有效的方法來做到這一點。

+0

我已經嘗試過,但將數字轉換爲字符串僅適用於固定數量的數字。 –

+0

你現在如何存儲長十進制數? – John

1

而且使用num2str,你可以這樣做:

sol=arrayfun(@str2num,(sprintf('%f',23432.23432)),'UniformOutput',0) 
horzcat(sol{:}) 

ans = 

    2  3  4  3  2  2  3  4  3 

你想保留什麼地方是逗號的信息?

+0

謝謝!! ...是的,我還需要在哪裏逗號。 –

+0

...但num2str的問題是,它可以轉換隻是固定數字的數字,舉一個例子: –

+0

如果我想要的數字23432.23432345678911111111111100998,你寫的功能不起作用 –

3

你從哪些輸入源獲取這些數字?這些數字都很重要嗎?您的示例數字已經超出了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類型。所以很多這些數字一旦輸入就會丟失。請參閱此問題以獲得更多討論:In MATLAB, are variables REALLY double-precision by default?

如果你真的想保留所有這些數字,你需要避免將它們存儲在雙打中。以字符串中的完整數字開始,然後解析它。

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 
+0

非常完整的答案。 – Oli

+0

這些數字來自以前的計算(這給了我非常相似的數字,所以我需要關注低位小數位上的數字)。感謝您的回答 –

+0

以前的計算是用「double」值完成的嗎?如果是這樣,由於精度問題,超過小數點後12位的數字已經是假的,並且試圖保留它們是沒有意義的。或者它是使用更高精度的類型並將它們作爲字符串或其他東西返回? –