【问题标题】:Matlab fprintf to keep significant figures and rightmost zeroesMatlab fprintf 保留有效数字和最右边的零
【发布时间】:2014-01-25 18:46:10
【问题描述】:

假设我有一个随机变量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。我对格式化不太熟悉,但必须有一个简单的方法。我在搜索中没有找到它。

【问题讨论】:

  • 那么如果a = 234.56,你希望输出是234.6吗?
  • 基本上是的。四舍五入会很好,但这里没有必要

标签: matlab formatting string-formatting


【解决方案1】:

如果要打印的值都小于 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

【讨论】:

    【解决方案2】:

    我决定以 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'
    

    【讨论】:

      猜你喜欢
      • 2021-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-25
      相关资源
      最近更新 更多