我想读取用户输入并将其存储为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
。
如何解决浮动和理性问题?
答案 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)