Джулия: Может ли ceil/floor вернуть целое число?

Почему ceil() и floor() не возвращают целое число? Как я могу вернуть целое число?

a = 10
b = 3
typeof(a/b)
  ## Float64

c = ceil(a/b)
typeof(c)
  ## Float64

Эта проблема беспокоила меня в контексте расчета диапазона, например.

k = 0:1:c
  ## 0.0:1.0:4.0
typeof(k)
  ## StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}

Полное раскрытие: я думаю, что у меня есть ответ, поэтому я собираюсь ответить на свой вопрос, однако, пожалуйста, опубликуйте ответ, если у вас есть лучший. Надеюсь, в следующий раз, когда кто-то посмотрит, они легко найдут здесь ответ.


person PatrickT    schedule 13.04.2021    source источник
comment
Одна вещь, которую следует учитывать в этом конкретном случае, заключается в том, что Джулия предоставляет cld, div и fld для вычисления ceil(Int, a/b), round(Int, a/b) и floor(Int, a/b), используя только целочисленную арифметику, которая, вероятно, быстрее и также не столкнется с проблемами округления.   -  person Oscar Smith    schedule 13.04.2021
comment
у вас также есть ÷ (вводится \div, затем tab), чтобы выполнить целочисленное деление.   -  person 张实唯    schedule 13.04.2021
comment
Очень хорошо знать Оскара и 张实唯. Не стесняйтесь добавлять ответ. Или я могу добавить информацию к моему ответу, как вы предпочитаете. Спасибо.   -  person PatrickT    schedule 13.04.2021


Ответы (1)


Иногда вы хотите, чтобы ceil() и floor() возвращали что-то отличное от целого числа, например. Inf, NaN. Однако вы можете вернуть целое число следующим образом:

julia> c = ceil(Int64, a/b)
julia> typeof(c)
Int64 

julia> k = 0:1:c
0:1:4

julia> typeof(k)
StepRange{Int64, Int64}

См. документы.

person PatrickT    schedule 13.04.2021