Matlab fprintf保留有效数字和最右边的零

时间:2014-01-25 18:46:10

标签: matlab formatting string-formatting

假设我有一个随机变量a=1.2400,我想用四个有效数字打印它,即1.240。我该怎么办呢?

fprintf('%0.4g',a) % drops rightmost zero
fprintf('%0.3f',a) % give too many sig figs if a >= 10

使用'%g'会删除重要的零,而使用'%f'我只能指定小数点后的位数,如果a=10.04,则会产生太多有效数字。我不太熟悉格式化,但必须有一个简单的方法。我在搜索中找不到它。

2 个答案:

答案 0 :(得分:0)

如果要打印的值均小于10000,则可以执行以下操作。 (对不起,只在八度音中测试过。)

octave:62> a = 1.24
a =  1.2400
octave:63> sprintf('%.*f\n', 3-floor(log10(abs(a))), a)
ans = 1.240

octave:64> a = 234.56
a =  234.56
octave:65> sprintf('%.*f\n', 3-floor(log10(abs(a))), a)
ans = 234.6

有关表达式floor(log10(abs(a)))的详情,请参阅How can I get the exponent of each number in a np.array?

如果您不介意指数表示法,另一种方法是使用'%.3e'始终获得相同数量的重要数字:

octave:70> a = 1.24
a =  1.2400
octave:71> sprintf('%.3e\n', a)
ans = 1.240e+00

octave:72> a = 234.56
a =  234.56
octave:73> sprintf('%.3e\n', a)
ans = 2.346e+02

答案 1 :(得分:0)

我决定以 Warren 的答案为基础,并编写了一个函数,该函数适用于小数和大数。也许有人会对此有所改进,但我对此很满意。

function str=sigfigstr(a,sigfigs)

numdecimal = floor(log10(abs(a)));

if sigfigs - numdecimal < 0
    str=sprintf('%.0f',round(a,sigfigs,'significant'));
else
    str=strip(sprintf('%.*f\n', sigfigs-floor(log10(abs(a))), a));
end

这里有几个例子,如果它在 Matlab 中运行

>> sigfigstr(.000012431634,3)
ans = '0.0000124'
>> sigfigstr(26666,3)
ans = '26700'