julia @printf改变我的变量

Olr*_*ric 5 julia

我觉得很难用Julia格式化数字:

b = 1.111111
bb = @printf "test : %5.2f" b
bb

test :  1.11
Run Code Online (Sandbox Code Playgroud)

那样就好.

using PyPlot 
annotate(@printf "test : %5.2f" b, xy=[1;1])

test : 
type: non-boolean (Array{Bool,1}) used in boolean context
while loading In[16], in expression starting on line 2
Run Code Online (Sandbox Code Playgroud)

我不明白,因为我希望@printf的结果是一个String.所以,如果有人可以解释我应该怎么做

"test : %5.2f" % b
Run Code Online (Sandbox Code Playgroud)

在Python中.

总而言之,这是奇怪的事情:

b
1
Run Code Online (Sandbox Code Playgroud)

b已投射到Int.你会称那个错误吗?

我使用Julia 0.3.2和Jupyter 3.1

Mat*_* B. 12

宏解析(特别是在函数调用的上下文中)有点挑剔.您可以通过引用它来了解Julia如何解析它:

julia> :(annotate(@printf "test : %5.2f" b, xy=[1;1]))
:(annotate(@printf "test : %5.2f" (b,xy) = [1,1]))
Run Code Online (Sandbox Code Playgroud)

如您所见,宏比函数参数"更贪婪".整个b, xy=[1;1]部分被视为@printf宏的唯一参数.这解释了为什么b更改的值- =已经将上下文从表示关键字参数更改为一般的元组赋值!

我强烈建议在更复杂的表达式中使用类似函数的语法,如下所示:

annotate(@sprintf("test : %5.2f", b), xy=[1;1])
Run Code Online (Sandbox Code Playgroud)

最后,请注意,我已经改变@printf@sprintf.前者返回nothing并简单地输出值,而后者返回一个可以传递给函数的字符串.