# @printf: significant digits in floating point representation

**URL:** <https://discourse.julialang.org/t/printf-significant-digits-in-floating-point-representation/29978>\
**Category:** General Usage\
**Tags:** question, latex, formatting, printf\
**Created:** [October 16, 2019, 9:54am UTC](https://discourse.julialang.org/t/printf-significant-digits-in-floating-point-representation/29978 "2019-10-16T09:54:12Z")\
**Posts on this page:** 1\
**Showing post:** 10

<div class="post-metadata">

**Author:** ![rafael.guerra](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rafael.guerra/32/216610_2.png) [@rafael.guerra](https://discourse.julialang.org/u/rafael.guerra)\
**Post date:** [February 4, 2024, 10:53pm UTC](https://discourse.julialang.org/t/printf-significant-digits-in-floating-point-representation/29978/10 "2024-02-04T22:53:27Z")

</div>

Fyi, you might want to check out [this MATLAB solution](https://www.mathworks.com/matlabcentral/answers/379814-is-there-an-easy-way-to-format-numbers-to-3-significant-figures#answer_686890).

Below is a simplified Julia version that produces the desired output:

```julia
using Printf

function str_significant(x::Float64, sigdig::Int)
    (x == 0) && (return "0")
    x = round(x, sigdigits=sigdig)
    n = length(@sprintf("%d", abs(x))) # length of the integer part
    if (x ≤ -1 || x ≥ 1)
        decimals = max(sigdig - n, 0) # 'sig - n' decimals needed 
    else
        Nzeros = ceil(Int, -log10(abs(x))) - 1 # No. zeros after decimal point before first number
        decimals = sigdig + Nzeros
    end 
    return @sprintf("%.*f", decimals, x)
end

str_significant(.000012340000, 2) # 0.000012
str_significant(.123400000000, 2) # 0.12
str_significant(1.234, 2) # 1.2
str_significant(1234000.000, 2) # 1200000

```

---

_[View the full topic](https://discourse.julialang.org/t/printf-significant-digits-in-floating-point-representation/29978)._
