我正在读取一些数据,其中输出,如果数字,总是存储为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
答案 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"