2011-12-02 2 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

숫자를 문자열로 취급하고 모든'.'s를 삭제 한 다음 작동하는 코드를 사용하십시오. – 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 자릿수가 이미 가짜이며이를 보존하려고 시도 할 필요가 없습니다. 아니면 좀 더 정밀도가 높은 유형을 사용하고 그것을 문자열이나 다른 것으로 반환하는 것입니까? –