如何四舍五入到最接近的倍数?

Ale*_*lec 6 julia

有没有一种惯用的方法来四舍五入到最接近的数字倍数?

number   multiple    result
12.2       0.5        12.0
12.2       0.25       12.25
12.4       0.5        12.5
Run Code Online (Sandbox Code Playgroud)

ahn*_*abb 11

您可以定义一个函数:

round_step(x, step) = round(x / step) * step
Run Code Online (Sandbox Code Playgroud)

用法:

julia> round_step(12.2, 0.25)
12.25
Run Code Online (Sandbox Code Playgroud)

这样的函数实际上在 Base 内部使用,用于将数字四舍五入到特定基数中的特定位数:

julia> Base._round_step(12.2, 0.25, RoundNearest)
12.25
Run Code Online (Sandbox Code Playgroud)

但是,由于这是一个内部实现细节,因此您不应依赖此函数。该函数依次调用_round_invstep.

julia> Base._round_invstep(12.2, 4, RoundNearest)
12.25

julia> Base._round_invstep(12.4, 2, RoundNearest)
12.5
Run Code Online (Sandbox Code Playgroud)

其中执行操作round(x * invstep, r) / invstep

因为您的示例恰好对应于基数 4 和基数 2 中的 0.1,您也可以round直接用于这些特殊情况:

julia> round(12.2; base=2, digits=1)
12.0

julia> round(12.2; base=4, digits=1)
12.25

julia> round(12.4; base=2, digits=1)
12.5
Run Code Online (Sandbox Code Playgroud)