gpt4 book ai didi

ruby - 如何将有理数格式化为小数?

转载 作者:数据小太阳 更新时间:2023-10-29 07:58:47 25 4
gpt4 key购买 nike

给定一个具有有限十进制表示的任意大(或小)有理数数,例如:

r = Rational(1, 2**15)
#=> (1/32768)

如何获取其完整的十进制值作为字符串?

上述数字的预期输出是:

"0.000030517578125"

to_f 显然不起作用:

r.to_f
#=> 3.0517578125e-05

sprintf 要求我指定位数:

sprintf('%.30f', r)
#=> "0.000030517578125000000000000000"

最佳答案

大多数十岁的 child 都知道怎么做:使用长除法!1

代码

def finite_long_division(n,d)
return nil if d.zero?
sign = n*d >= 0 ? '' : '-'
n, d = n.abs, d.abs
pwr =
case n <=> d
when 1 then power(n,d)
when 0 then 0
else -power(d,n)-1
end
n *= 10**(-pwr) if pwr < 0
d *= 10**(pwr) if pwr >= 0
s = ld(n,d)
t = s.size == 1 ? '0' : s[1..-1]
"%s%s.%s x 10^%d" % [sign, s[0], t, pwr]
end

def power(n, d)
# n > d
ns = n.to_s
ds = d.to_s
pwr = ns.size - ds.size - 1
pwr += 1 if ns[0, ds.size].to_i >= ds.to_i
pwr
end

def ld(n,d)
s = ''
loop do # .with_object('') do |s|
m,n = n.divmod(d)
s << m.to_s
return s if n.zero?
n *= 10
end
end

例子2

finite_long_division(1, 2**15)
#=> "3.0517578125 x 10^-5"
finite_long_division(-1, 2**15)
#=> "-3.0517578125 x 10^-5"
finite_long_division(-1, -2**15)
#=> "3.0517578125 x 10^-5"

finite_long_division(143, 16777216)
#=> "8.523464202880859375 x 10^-6"
143/16777216.0
#=> 8.52346420288086e-06

finite_long_division(8671,
803469022129495137770981046170581301261101496891396417650688)
#=> "1.079195309486679194852923588206549145803161531099624\
# 804222395643336829571798416196370119711226461255452\
# 67714596064934085006825625896453857421875 x 10^-56"

回想一下,每个有理数要么有十进制表示,要么包含无限重复的数字序列(例如,1/3 #=> 0.33333...3227/555 # => 5.8144144144...1/9967 #=> 0.00010033109260559848...3)。因此,如果有理数是重复序列变体,则该方法永远不会终止。由于人们通常事先不知道有理数是哪种类型,因此修改方法以首先确定有理数是否具有有限小数表示形式可能很有用。众所周知,当且仅当 d 可被 2< 整除时,无法减少(通过删除公因数)的有理数 n/d 具有此属性5 并且不能被任何其他素数整除。4 我们可以很容易地构造一个方法来确定一个已经减少的有理数是否具有该属性。

require 'prime'

def decimal_representation?(n, d)
primes = Prime.prime_division(d).map(&:first)
(primes & [2,5]).any? && (primes - [2, 5]).empty?
end

1 至少我小时候是这样。

2 参见 here对于具有有限小数表示的有理数的部分列表

3 这个有理数的重复序列包含 9,966 位。

4 Reference .

关于ruby - 如何将有理数格式化为小数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40807764/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com