Печать с определенной (определенной во время выполнения) точностью в Julia - PullRequest
0 голосов
/ 07 июня 2018

Учитывая значение 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 был макросом, нужно знать n во время компиляции.

Возможно ли это с помощью какой-нибудь show магии или чего-то еще?

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

К сожалению, по какой-то причине julia-версия @printf / @sprintf не поддерживает под-спецификатор "width" согласно стандарту c printf (см. man 3 printf).

Если вычувствуя себя смелым, вы можете положиться на c sprintf, который поддерживает модификатор «dynamic width», для сбора строки, которую вы затем просто печатаете как обычно.

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, служащий модификатором динамической ширины.

0 голосов
/ 07 июня 2018

Используя новый пакет Format.jl :

using Format

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

foo(2.5, 5)
...