使用JavaScript将比率转换为百分比

使用JavaScript将比率转换为百分比,javascript,image,Javascript,Image,我正在编写脚本,以支持web应用程序显示图像,并允许用户缩放/平移以查看更多细节。该脚本使用JavaScript编写,支持0%到100%之间的默认缩放级别,其中0%表示为适应浏览器窗口而缩小后的图像大小,100%表示全分辨率图像。以下公式用于获取给定的百分比,并使用正确的默认缩放级别显示图像。下面的公式是我用来确保它正确运行的一些计算。请注意,比率表示图像之间的大小差异 X / (((Y - 1) * Z) + 1) X = Ratio 1 Y = Ratio 2 Z = Percentage

我正在编写脚本,以支持web应用程序显示图像,并允许用户缩放/平移以查看更多细节。该脚本使用JavaScript编写,支持0%到100%之间的默认缩放级别,其中0%表示为适应浏览器窗口而缩小后的图像大小,100%表示全分辨率图像。以下公式用于获取给定的百分比,并使用正确的默认缩放级别显示图像。下面的公式是我用来确保它正确运行的一些计算。请注意,比率表示图像之间的大小差异

X / (((Y - 1) * Z) + 1)

X = Ratio 1
Y = Ratio 2
Z = Percentage as Decimal

3.29 / (((3.29 - 1) * 000.00) + 1) = 3.29
3.29 / (((3.29 - 1) * 000.01) + 1) = 3.22
3.29 / (((3.29 - 1) * 000.10) + 1) = 2.67
3.29 / (((3.29 - 1) * 000.90) + 1) = 1.07
3.29 / (((3.29 - 1) * 001.00) + 1) = 1.00
3.29 / (((3.29 - 1) * 001.50) + 1) = 0.74
3.29 / (((3.29 - 1) * 002.00) + 1) = 0.58
3.29 / (((3.29 - 1) * 003.00) + 1) = 0.42
3.29 / (((3.29 - 1) * 004.00) + 1) = 0.32
3.29 / (((3.29 - 1) * 005.00) + 1) = 0.26
3.29 / (((3.29 - 1) * 010.00) + 1) = 0.13
3.29 / (((3.29 - 1) * 025.00) + 1) = 0.05
3.29 / (((3.29 - 1) * 050.00) + 1) = 0.03
3.29 / (((3.29 - 1) * 075.00) + 1) = 0.02
3.29 / (((3.29 - 1) * 100.00) + 1) = 0.01
我的问题是,如果用户更改缩放级别,我想简要显示它,但需要将比率转换为百分比。棘手的是,一切都是颠倒的,其中1 fixed总是代表完整大小的图像,因为它的大小比是1:1。较大的数字表示两个图像之间的大小差异,表示为转换为十进制的比率

Case 1:
3.290 = 0% (no zoom)
2.145 = 50%
1.000 = 100% (max zoom)
------------
1.183 = ?

Case 2:
5.470 = 0%
3.235 = 50%
1.000 = 100%
------------
4.680 = ?

Case 3:
7.630 = 0%
4.317 = 50%
1.000 = 100%
------------
3.745 = ?
最后,我广泛地寻找答案,但没有结果。有人能帮我找到解决办法吗

更新: 我接近一个答案,只是结果是相反的。在这种应用中,由于计算中使用了比率,所以越少越好。另外,在我的第一个例子中不清楚,但是Y和Z是可变的,X是固定的。由于Y表示可变图像比率,因此在初始化期间它始终与X相同,因为用户尚未更改图像大小

在以下示例中,X=3.290,Y在1和3.290之间变化,其中3.290应表示0%,1应表示100%

(Y - 1) / (X - 1) = Z

(3.290 - 1) / (3.290 - 1) * 100 = 100.0%
(3.235 - 1) / (3.290 - 1) * 100 = 097.5%
(2.280 - 1) / (3.290 - 1) * 100 = 055.8%
(2.230 - 1) / (3.290 - 1) * 100 = 053.7%
(2.145 - 1) / (3.290 - 1) * 100 = 050.0%
(1.830 - 1) / (3.290 - 1) * 100 = 036.2%
(1.660 - 1) / (3.290 - 1) * 100 = 028.8%
(1.100 - 1) / (3.290 - 1) * 100 = 004.3%
(1.010 - 1) / (3.290 - 1) * 100 = 000.4%
(1.000 - 1) / (3.290 - 1) * 100 = 000.0%

简单地为Z解X/Y-1*Z+1=N是完全正确的,但没有多大帮助,因为您的结果,即N是四舍五入的

让我们以最后一个为例:

3.29/3.29-1*100.00+1=0.01

这是不正确的,结果是329/23000或十进制:0.014 3043478260869525217391304347826086956525217391空格后的序列无限重复,因此,N=0.01的X-N/N*Y-1给出32800/229或约143.2314410十进制,这与预期的100.0相差很大,接近50%

没有简单的解决办法。可能最简单的方法是在列表中使用更多的数字,并将精度四舍五入到两位数,例如:toFixed,让用户厌恶


最复杂的是使用所有的有理数,也就是说,我可以毫不羞耻地自由地承认。我通过使用以下公式计算百分比的倒数来解决我的问题

((X - 1) - (Y - 1)) / (X - 1) * 100 = Z

((3.290 - 1) - (3.290 - 1)) / (3.290 - 1) * 100 = 000.0%
((3.290 - 1) - (3.235 - 1)) / (3.290 - 1) * 100 = 002.4%
((3.290 - 1) - (2.280 - 1)) / (3.290 - 1) * 100 = 044.1%
((3.290 - 1) - (2.230 - 1)) / (3.290 - 1) * 100 = 046.3%
((3.290 - 1) - (2.145 - 1)) / (3.290 - 1) * 100 = 050.0%
((3.290 - 1) - (1.830 - 1)) / (3.290 - 1) * 100 = 063.8%
((3.290 - 1) - (1.660 - 1)) / (3.290 - 1) * 100 = 071.2%
((3.290 - 1) - (1.100 - 1)) / (3.290 - 1) * 100 = 095.6%
((3.290 - 1) - (1.010 - 1)) / (3.290 - 1) * 100 = 099.6%
((3.290 - 1) - (1.000 - 1)) / (3.290 - 1) * 100 = 100.0%

你的最高公式是X/Y-1*Z+1=N如果你知道N,X和Y,那么Z=X/N-1/Y-1这能回答你的问题吗?谢谢你的回答。当我喝第二杯咖啡时,我正在测试你建议的配方,它似乎是有效的。然而,这两个公式都有一个奇怪的变化,我无法解释。它非常小,我把它归因于计算机舍入逻辑。恐怕我说得太快了。建议公式的结果看起来不错,直到我到达光谱的任意一端,它都失败了。似乎通过解决我的问题,我发现我原来的公式一直都是错误的。通过一些数学上的怪癖,这是足够接近工作,但我无法解释的数字不完全是他们应该是什么。给定以下公式,如果所有其他变量都已知,我如何求解Y?X-1-Y-1/X-1*100=ZY=1-Z/100*X-1+1四舍五入后是正确的。其中3.29/3.29-1*100+1=0.01430434782608695652174是实际答案,至少在我能够计算的精度水平上是这样。1和0之间的空间是无限的,但我的应用程序不需要高精度。