在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,...
命令的載體,但那些不適合與非整數,並且一些解決方案有數字與大數小數位的問題...
這種轉換是需要的,因爲我希望看到並使用該號碼的所有數字。
在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,...
命令的載體,但那些不適合與非整數,並且一些解決方案有數字與大數小數位的問題...
這種轉換是需要的,因爲我希望看到並使用該號碼的所有數字。
不熟悉Matlab的語法,但如果你
這將工作。有可能更有效的方法來做到這一點。
我已經嘗試過,但將數字轉換爲字符串僅適用於固定數量的數字。 –
你現在如何存儲長十進制數? – John
而且使用num2str
,你可以這樣做:
sol=arrayfun(@str2num,(sprintf('%f',23432.23432)),'UniformOutput',0)
horzcat(sol{:})
ans =
2 3 4 3 2 2 3 4 3
你想保留什麼地方是逗號的信息?
謝謝!! ...是的,我還需要在哪裏逗號。 –
...但num2str的問題是,它可以轉換隻是固定數字的數字,舉一個例子: –
如果我想要的數字23432.23432345678911111111111100998,你寫的功能不起作用 –
你從哪些輸入源獲取這些數字?這些數字都很重要嗎?您的示例數字已經超出了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
非常完整的答案。 – Oli
這些數字來自以前的計算(這給了我非常相似的數字,所以我需要關注低位小數位上的數字)。感謝您的回答 –
以前的計算是用「double」值完成的嗎?如果是這樣,由於精度問題,超過小數點後12位的數字已經是假的,並且試圖保留它們是沒有意義的。或者它是使用更高精度的類型並將它們作爲字符串或其他東西返回? –
我會把這個數字看作一個字符串,刪除所有'''',然後使用你說的工作代碼。 – Blender
@Virginia:如果你的意思是你需要在計算中使用所有的數字,那麼不用擔心,即使默認情況下它們不會被顯示,Matlab也會使用它們(儘管'format long'會改變它)。 – Jonas
@Jonas:不,她的例子中有太多的數字在「雙」中「合適」;一旦轉化,一些人就會失去平衡。 –