在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,...
但这些命令不适合非整数,并且一些解决方案存在大量小数位数的问题......
需要这种转换,因为我想查看和使用数字的所有数字。
您从哪个输入源获得这些数字?所有这些数字都很重要吗?您的示例数字已经超出了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 源代码中键入一个数字时,它被视为 type 的文字double
。许多数字一输入就丢失了。有关更多讨论,请参阅此问题:在 MATLAB 中,变量是否默认为双精度?.
如果您真的想保留所有这些数字,则首先需要避免将它们存储在双精度中。从字符串中的完整数字开始,然后解析它。
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
同样使用num2str
,您可以执行以下操作:
sol=arrayfun(@str2num,(sprintf('%f',23432.23432)),'UniformOutput',0)
horzcat(sol{:})
ans =
2 3 4 3 2 2 3 4 3
您想保留有关逗号在哪里的信息吗?
不熟悉 Matlab 语法,但如果你
那行得通。可能有更有效的方法来做到这一点。