5 julia
执行时trunc(3.5),它返回一个浮点数3.0,为什么?
我知道你可以做trunc(Int64, 3.5),但是trunc将浮点数转换为整数的目的不是吗?为什么它以这种方式工作?
让我们专注于传递 a Float64to 的情况trunc(分析可以类似地扩展到其他类型)。假设您要截断的值是x.
首先注意 thentrunc总是可以对x小于或等于它的最接近的整数值进行截断。简而言之 - 此操作始终定义明确,可以执行,快速且类型稳定。
如果我们想返回一个整数,我们有一个选择:我们是否想要类型稳定。在 Julia 中,Base 中的答案是肯定的。但这意味着您必须返回BigInt值才能始终明确定义操作。但可能当你这样trunc做时,你不会期望得到,BigInt因为它会很贵。
另一种方法是返回一些其他整数类型,但是如果浮点数太大,您将不得不再次抛出错误 - 这很可能是您不想得到的。
这是一个显示问题的示例:
julia> x = 1e300
1.0e300
julia> trunc(x)
1.0e300
julia> trunc(Int, x)
ERROR: InexactError: trunc(Int64, 1.0e300)
Stacktrace:
[1] trunc(::Type{Int64}, ::Float64) at ./float.jl:703
[2] top-level scope at REPL[35]:1
julia> trunc(BigInt, x)
1000000000000000052504760255204420248704468581108159154915854115511802457988908195786371375080447864043704443832883878176942523235360430575644792184786706982848387200926575803737830233794788090059368953234970799945081119038967640880074652742780142494579258788820056842838115669472196386865459400540160
Run Code Online (Sandbox Code Playgroud)
所以总而言之 - 因为浮点数可以跨越比普通整数更广泛的值范围,唯一安全的选择是默认返回浮点数。