2011-12-02 93 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位的数字已经是假的,并且试图保留它们是没有意义的。或者它是使用更高精度的类型并将它们作为字符串或其他东西返回? –