如何检查浮点数中是否保存了整数值?

时间:2018-02-07 09:10:20

标签: casting type-conversion julia

我正在读取一些数据,其中输出,如果数字,总是存储为Float,我想清理它,如果它实际上是可能的(例如1.0),或者如果没有,则保留原始类型。

使用try / catch是最好的方法吗?

function convertToIntIfPossible(x)
    try
     return convert(Int64,x)
    catch
        return x
    end
end
anInt   = convertToIntIfPossible(1.0)
aFloat  = convertToIntIfPossible(1.23)
aString = convertToIntIfPossible("aaa")

编辑:这(来自crstnbr的答案)要快得多:

function convertToIntIfPossible2(x)
    if typeof(x) <: Number
        if isinteger(x)
            return convert(Int64,x)
        else
            return x
        end
    else
        return x
    end
end

EDIT2:这更快(tk Alexander Morley):

function convertToIntIfPossible2(x)
    if typeof(x) <: Number
        if (x == trunc(x))
            return Int64(x)
        else
            return x
        end
    else
        return x
    end
end

3 个答案:

答案 0 :(得分:2)

可以创建两个这样的方法:

convertToIntIfPossible(x::AbstractFloat) = (x == trunc(x)) ? Int64(x) : x

convertToIntIfPossible(x) = x

但是如果可能的话,整个事情听起来并不是一个好主意,因为Julia中的高性能代码需要Type Stability

您真的想将数字转换为整数,还是只希望它们显示而没有任何小数点。如果是后者那么我猜有更优雅的解决方案。

答案 1 :(得分:2)

关注问题的标题&#34;如何检查整数值是否已保存在浮点数中?&#34;,我想直截了当地回答isinteger(x)

  

isinteger(x) - &gt;布尔

     

测试x在数值上是否等于某个整数。

  julia> isinteger(4.0)
  true

示例:

julia> IntInDisguise = 3.0
3.0

julia> ReallyFloat = 3.141
3.141

julia> ReallyInteger = 3
3

julia> isinteger(IntInDisguise)
true

julia> isinteger(ReallyFloat)
false

julia> isinteger(ReallyInteger)
true

答案 2 :(得分:1)

要添加Alexander Morley的评论,这里有一个更加逐步的方法来获取convertifpossibletoint函数,这可能更像朱利安:

tryconvert(T, x) = try Nullable{T}(convert(T,x)) catch Nullable{T}() end

convertifpossible(T,x) = get(tryconvert(T,x),x)

convertifpossibletoint(x) = convertifpossible(Int, x)

,并提供:

julia> convertifpossibletoint(1.0)
1

julia> convertifpossibletoint(1.1)
1.1

julia> convertifpossibletoint("abc")
"abc"