在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 :(得分: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
答案 1 :(得分:1)
同样使用num2str
,你可以这样做:
sol=arrayfun(@str2num,(sprintf('%f',23432.23432)),'UniformOutput',0)
horzcat(sol{:})
ans =
2 3 4 3 2 2 3 4 3
您想保留逗号在哪里的信息吗?
答案 2 :(得分:0)
不熟悉Matlab语法但是如果你
这会奏效。可能有更有效的方法来实现这一目标。