これらの数値はどの入力ソースから取得していますか? そして、それらの数字はすべて有効ですか?あなたの例の数値は、すでに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 ソース コードに数値を入力すると、 type のリテラルとして扱われdouble
ます。これらの数字の多くは、入力するとすぐに失われます。詳細については、この質問を参照してください: MATLAB では、デフォルトで変数は本当に倍精度ですか? .
これらすべての数字を本当に保持したい場合は、そもそもそれらを double に格納しないようにする必要があります。文字列内の完全な数値から始めて、それを解析します。
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