解析朱莉娅对理性的输入

时间:2016-02-15 16:13:04

标签: input type-conversion julia rational-number

我想读取用户输入并将其存储为Rational,无论类型如何:integer,float ot rational。例如:

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)))

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

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

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

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

3 个答案:

答案 0 :(得分:6)

一种方法是parse原始输入Expr(符号),eval表达式,将其转换为Float64并使用rationalize简化理性生成:

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中指定错误。

使用Julia Version 0.4.3进行测试

答案 1 :(得分:0)

高度复合整数的乘法(然后除法)效果非常好。

julia> N = 2*2 * 3*3 * 5*5 * 7 * 11 * 13
900900

julia> a = round(Int, N * parse(Float64, "2.3")) // N
23//10

julia> a = round(Int, N * parse(Float64, "5")) // N
5//1

julia> a = round(Int, N * parse(Float64, "9.1111111111")) // N
82//9

答案 2 :(得分:0)

您可以实施自己的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)