在朱莉娅中将输入解析为理性



我想读取用户输入并将其存储为理性,无论类型是什么:整数,浮点数或理性。例如:

5 --> store it as 5//1
2.3 --> store it as 23//10
4//7 --> store it as 4//7

目前我写了以下内容:

a = convert(Rational,parse(Float64,readline(STDIN)))

如果我输入一个整数,比如 5,那就好了。

但是如果我输入 2.3,a存储2589569785738035//1125899906842624 .

如果我输入一个分数(无论是形式4/7还是形式4//7(,我都会得到一个ArgumentError: invalid number format for Float64.

如何解决浮动和理性问题?

一种方法是将原始输入解析为Expr(符号(,评估表达式,将其转换为Float64并使用合理化来简化生成的有理数:

julia> rationalize(convert(Float64, eval(parse("5"))))
5//1
julia> rationalize(convert(Float64, eval(parse("2.3"))))
23//10
julia> rationalize(convert(Float64, eval(parse("4/7"))))
4//7
julia> rationalize(convert(Float64, eval(parse("4//7"))))
4//7

rationalize使用近似浮点数,您可以在参数 tol 中指定错误。

与朱莉娅版本 0.4.3 一起测试

<小时 />

更新parse 方法在 Julia 版本>= 1.0 中已弃用。应该使用两种方法:Base.parse(仅用于数字,并且需要 Type 参数(和 Meta.parse(用于表达式(:

julia> rationalize(convert(Float64, eval(parse(Int64, "5"))))
5//1
julia> rationalize(convert(Float64, eval(parse(Float64, "2.3"))))
23//10

以(然后除法(到高度复合的整数效果很好。

朱莉娅>N = 2*2 * 3*3 * 5*5 * 7 * 11 * 13900900julia> a = round(Int, N * parse(Float64, "2.3"((//N23//10Julia> a = round(Int, N * parse(Float64, "5"((//N5//1julia> a = round(Int, N * parse(Float64, "9.1111111111"((//N82//9

你可以实现你自己的parse

function Base.parse(::Type{Rational{Int}}, x::ASCIIString)
    ms, ns = split(x, '/', keep=false)
    m = parse(Int, ms)
    n = parse(Int, ns)
    return m//n
end
Base.parse(::Type{Rational}, x::ASCIIString) = parse(Rational{Int}, x)

相关内容

  • 没有找到相关文章

最新更新