Printing 打印到特定(运行时确定)精度(单位:秒)

Printing 打印到特定(运行时确定)精度(单位:秒),printing,decimal,julia,rounding,decimal-point,Printing,Decimal,Julia,Rounding,Decimal Point,给定一个值x和一个整数n(在运行时分配),我希望将x打印到小数点后的n位(如果需要,在四舍五入之后) 打印(圆形(x,n))适用于(x,n)=(3.141592,3),但对于(x,n)=(2.5,5),它只打印2.5,而不是2.50000(小数点后5位) 如果我在运行时知道n,比如说5,我就能做到 @printf("%.5f", x) 但是@printf作为宏需要在编译时知道 这是否可以使用一些showmagic或其他方法实现 使用新包装: 不幸的是,由于某些原因,@printf/@sprin

给定一个值x和一个整数n(在运行时分配),我希望将x打印到小数点后的n位(如果需要,在四舍五入之后)

打印(圆形(x,n))
适用于
(x,n)=(3.141592,3)
,但对于
(x,n)=(2.5,5)
,它只打印
2.5
,而不是
2.50000
(小数点后5位)

如果我在运行时知道n,比如说5,我就能做到

@printf("%.5f", x)
但是@printf作为宏需要在编译时知道

这是否可以使用一些
show
magic或其他方法实现

使用新包装:


不幸的是,由于某些原因,@printf/@sprintf的julia版本不支持c printf标准中的“宽度”子说明符(请参见
man 3 printf

如果你觉得很勇敢,你可以依靠支持“动态宽度”修饰符的c sprintf来收集一个字符串,然后正常打印

A=Vector{UInt8}(100);#初始化100个“字符”的数组
ccall(:sprintf,Int32,(Ptr{UInt8},Cstring,Int64,Float64),A,“%.*f”,4,0.1)
打印(不安全的_字符串(指针(A))#>0.1000

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

请参见,julia不支持使用
*
作为宽度修饰符的unix标准,这很奇怪,也很不幸。哈,我在一百万年内从未想过使用
ccall
。我可能永远不会使用这种方法,但这是你创造性解决问题的道具!
using Format

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

foo(2.5, 5)