在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:不,她的例子中有太多的数字在“双”中“合适”;一旦转化,一些人就会失去平衡。 –