在Julia中打印到特定(运行时确定的)精度

时间:2018-06-07 13:59:01

标签: printing decimal julia rounding decimal-point

给定值x和整数n(在运行时分配),我想将x打印到小数点后的正好n位数(如果需要,在舍入后)。

print(round(x, n))适用于(x,n)=(3.141592, 3),但对于(x,n)=(2.5,5),它仅打印2.5,而不是2.50000(小数点后5位)。

如果我在运行时知道n,说5,我可以做

@printf("%.5f", x)

但是@printf是一个宏需要在编译时知道。

使用某些show魔法还是别的东西可以吗?

2 个答案:

答案 0 :(得分:4)

使用全新的Format.jl包:

using Format

function foo(x, n)
    f = FormatSpec(".$(n)f")
    pyfmt(f, x)
end

foo(2.5, 5)

答案 1 :(得分:3)

不幸的是,由于某种原因,@ printf / @sprintf的julia版本不支持" width"根据c printf标准的子说明符(参见man 3 printf)。

如果你感到勇敢,你可以依靠支持"动态宽度的c sprintf"修饰符,用于收集您只需正常打印的字符串。

A = Vector{UInt8}(100); # initialise array of 100 "chars"
ccall( :sprintf, Int32, (Ptr{UInt8}, Cstring, Int64, Float64), A, "%.*f", 4, 0.1 )
print( unsafe_string(pointer(A)) )    #> 0.1000

请注意%.*f中的星号,以及用作动态宽度修饰符的额外输入4