最好用一个例子来描述问题。假设我的小数值为100.227273。
100.227273 * X = Y
我需要找到给出整数Y的最小正整数X.
答案 0 :(得分:18)
如果100.227273只是一个近似值,并且您希望获得最佳有理逼近,请使用continued fractions。
以100.227273为例。
所以你得到了
1
100.227273 = 100 + —————————
1
4 + —————
1
2 + —
2
简化此表达式以获得2205/22。
[编者注:例如代码,请参阅this answer。]
答案 1 :(得分:12)
1000000/gcd(1000000,227273)
。也称为lcm(1000000,227273)/227273
。在这种情况下,100万。
您想要做的是将0.227273变成最简单形式的分数。您正在寻找的数字是该分数的分母。由于227273/1000000已经是最简单的形式,你已经完成了。但如果你的输入是100.075,那么75/1000不是最简单的形式。最简单的形式是3/40,因此X的解决方案是40。
作为优化,你可以简化计算,因为你知道起始分母是10的幂,所以它唯一的素数因子是2和5.所以你需要在分子中寻找的是2的可分性和5,这比Euclid的算法更容易。当然,如果你已经有了gcd和/或lcm的实现,那么你需要付出更多努力,而不是更少。
请记住,当您得到结果时,浮点数通常不能精确地表示小数部分。因此,一旦你有了数学上正确的答案,当你进行浮点乘法时,它不会必然给你一个整数答案。另一方面,当然这个问题仅适用于您感兴趣的数字的有限十进制表达式。
如果您首先将数字作为商,那么您需要直接找到其最简单形式的分母,而不是将其转换为十进制并截断它。例如,要解决数字“6和三分之一”的问题,答案是3,而不是10的任何幂。如果输入是“2的平方根”,那么X没有解。/ p>
实际上,具有您需要的属性的最小整数X是0
,但我认为您不是那个意思; - )
答案 2 :(得分:3)
我有种感觉你的意思是这样的:
How to convert floats to human-readable fractions?
答案 3 :(得分:1)
如果正十进制值D在小数点右边有n位,那么D * 10 ^ n是一个整数,X = 10 ^ n / gcf(10 ^ n,D * 10 ^ n)= lcm (10 ^ n,D * 10 ^ n)是最小的正整数X.
答案 4 :(得分:1)
我假设输入十进制r
是一个带有终止十进制表示的正有理数r
。
设d
为小数点后的位数(假设我们已从r
的decmial表示中修剪了所有无关的零)。然后请注意10^d * r
是一个整数m
。让g = gcd(10^d, m)
。然后10^d / g * r = m / g
是整数p
。让q = 10^d / g
。我声称q
是最小的正整数。