Search code examples
matlabformattingstring-formatting

Matlab fprintf to keep significant figures and rightmost zeroes


Let's say I have a random variable a=1.2400, and I want to print it with four significant figures, i.e., 1.240. How would I go about that?

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

Using '%g' drops the important zeros, and with '%f' I can only specify the number of digits after the decimal, which results in too many significant figures if, say, a=10.04. I'm not too familiar with formatting ,but there has to be a simple method. I haven't found it in my searches.


Solution

  • If the values to be printed are all less than 10000, you can do the following. (Sorry, only tested in octave.)

    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
    

    For more about the expression floor(log10(abs(a))), see How can I get the exponent of each number in a np.array?

    If you don't mind exponential notation, another alternative is to use '%.3e' to always get the same number of signficant digits:

    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