그 입력 소스는 무엇입니까? 그리고 그 모든 숫자가 중요합니까? 예제 번호는 이미 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
숫자를 문자열로 취급하고 모든'.'s를 삭제 한 다음 작동하는 코드를 사용하십시오. – Blender
@Virginia : 계산에서 모든 자릿수를 사용해야한다는 것을 의미한다면 Matlab은 기본적으로 표시되지 않지만 ('format long'이 이것을 변경하더라도) 사용합니다. – Jonas
@Jonas : 아니요, 예제 번호에 숫자가 너무 많아서 '이중'에 '적합'하지 않습니다. 일부는 변환되는 즉시 반올림으로 손실됩니다. –