Algorithm 给定一些四舍五入的数字,如何找到原始分数?

Algorithm 给定一些四舍五入的数字,如何找到原始分数?,algorithm,integer,fractions,Algorithm,Integer,Fractions,在问了这个问题之后,我想这毕竟是个更好的地方 我有一个小的正数列表,四舍五入到(比如)两位小数: 1.15 (can be 1.145 - 1.154999...) 1.92 (can be 1.915 - 1.924999...) 2.36 (can be 2.355 - 2.364999...) 2.63 (can be 2.625 - 2.634999...) 2.78 (can be 2.775 - 2.784999...) 3.14 (can

在问了这个问题之后,我想这毕竟是个更好的地方

我有一个小的正数列表,四舍五入到(比如)两位小数:

 1.15  (can be  1.145 -  1.154999...)
 1.92  (can be  1.915 -  1.924999...)
 2.36  (can be  2.355 -  2.364999...)
 2.63  (can be  2.625 -  2.634999...)
 2.78  (can be  2.775 -  2.784999...)
 3.14  (can be  3.135 -  3.144999...)
24.04  (can be 24.035 - 24.044999...)
我怀疑这些数字是整数的分数,所有的分子或分母都是相等的。在这种情况下,选择
100
作为公分母将起作用,最后一个值将保留为
2404/100
。但可能有一个“更简单”的解决方案,其整数要小得多

如何有效地找到最小的公共分子和/或分母?或者(如果这是不同的)将导致最小的最大分母resp。分子


当然,我可以对小列表/数字和小数进行暴力攻击。在这个例子中可以找到
83/72
138/72
170/72
189/72
200/72
226/72
1731/72

假设这些数字没有太多的有效数字,并且不会太大,可以尝试增加分母,直到找到有效的解决方案。这不仅仅是野蛮的强迫。此外,只要没有发现任何东西,下面的脚本将停留在违反约束的数字上,以期更快地获得更高的分母,而不必计算没有问题的数字

其工作原理如下:

x / y < a / b   if   x * b < a * y
ceil(…)部分计算满足低边界约束的最小可能分子,其余部分检查它是否也稳定高边界

最好使用实整数计算,例如,在Java中使用long,然后ceil部分变成:

(loNum * d + loDen - 1) / loDen
函数findRatios(arr){
设lo=[],hi=[],连续=0,d=1
for(设i=0;ifindRatios([1.15,1.92,2.36,2.63,2.78,3.14,24.04])
这有帮助吗?因此,为了清楚(在编辑之后),您希望找到最小的公共分母(或分子)(我想这是我遗漏的位),其中数字仍在2位有效数字的舍入范围内?你对分母和分子有偏好吗?是的,没有编辑过这方面的内容。分母或分子:以较简单的为准(结果是较小的数字)。您是否从文本文件中读取?那么数字是双倍还是字符串?我这样问是因为,例如在JS 2.36*10=23.59999998中。所以在这种情况下,我更喜欢字符串。@maraca我不认为这有什么关系。
(loNum * d + loDen - 1) / loDen