假设我有一个随机变量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
,则会产生太多有效数字。我不太熟悉格式化,但必须有一个简单的方法。我在搜索中找不到它。
答案 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'