gpt4 book ai didi

ruby - 在 Ruby 中将数字四舍五入到最接近的小数八分之一或三分之一

转载 作者:太空宇宙 更新时间:2023-11-03 16:24:36 25 4
gpt4 key购买 nike

我想在 Ruby 中将任何给定数字四舍五入为八分之一或三分之一,以最接近者为准。

我希望得到像 1/82/3 这样的输出。

我试过以下方法:

scalar_in_eighths = (scalar * 8.0).round / 8.0
scalar_in_thirds = (scalar * 3.0).round / 3.0

thirds_difference = (scalar - scalar_in_thirds).abs
eighths_difference = (scalar - scalar_in_eighths).abs

compute_in_thirds = thirds_difference < eighths_difference

if compute_in_thirds
less_than_eighth = false
rounded_scalar = scalar_in_thirds
else
less_than_eighth = false
rounded_scalar = scalar_in_eighths
end

quotient, modulus = rounded_scalar.to_s.split '.'
quotient = quotient.to_f
modulus = ".#{modulus}".to_f

这对八位数很有效,但对于像 1.32 这样的数字,它就失效了。

对小数部分执行 modulus.numeratormodulus.denominator 将产生类似 600479950316066118014398509481984 的数字.

有没有更好的办法解决这个问题?

最佳答案

这是您可以编写的一种方式。

代码

def closest_fraction(f,*denominators)
n, frac = denominators.map { |n| [n, round_to_fraction(f,n)] }
.min_by { |_,g| (f-g).abs }
[(n*frac).round, n, frac]
end

def round_to_fraction(f,n)
(f*n).round/n.to_f
end

示例

closest_fraction(2.33, 3, 8)
#=> [7, 3, 2.3333333333333335]
closest_fraction(2.12, 3, 8)
#=> [17, 8, 2.125]
closest_fraction(2.46, 2, 3, 5)
#=> [5, 2, 2.5]
closest_fraction(2.76, 2, 3, 5, 7, 11, 13, 17)
#=> [47, 17, 2.764705882352941]

关于ruby - 在 Ruby 中将数字四舍五入到最接近的小数八分之一或三分之一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27463652/

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