确定较大的数并进行除法运算。

4

好的,我不知道如何简短地表达这个问题。

这是我的代码:

var ratio, input={w:100,h:50};
if(input.w <= input.h) ratio = input.h / input.w;
else                   ratio = input.w / input.h;

问题: 有没有更快、更好、"需要较少代码"的方法来计算比率?而不是使用if/else语句。

谢谢!


1
你也可以先排序:var sorted = [input.w, input.h].sort(), ratio = sorted[1] / sorted[0] - pimvdb
5个回答

10

你可以使用三元条件运算符。语法:

condition ? (statement if true) : (statement if false);

根据您的情况:

ratio = (input.w <= input.h) ? (input.h/input.w) : (input.w/input.h);

编辑:

这并不比你的解决方案更快,只是更容易编写而已。我建议不要使用:

var ratio = Math.Max(input.w, input.h) / Math.Min(input.w, input.h)

这将对数字进行两次比较(一次在Math.Max中,一次在Math.Min中),这会使速度变慢。


在当前版本的Chrome中,被接受的解决方案不仅性能差,而且可读性也较差。而反对使用max min的建议目前在Chrome 28中是最快的。 - Bart Calixto

7
var ratio = Math.max(input.w, input.h) / Math.min(input.w, input.h)

另一种[可能更有效率的方法]:

var ratio = Math.max(input.w / input.h, 1 / input.w / input.h);

比三元运算符更高效:
var ratio = w / h ;
ratio = ratio > 1 && ratio || 1/ratio

2
这样做会比较两次数字,而不是一次,对吗? - Luchian Grigore
还要注意,它会抛出语法错误...方法是 maxmin(小写)。 - James Allardice
@LuchianGrigore - 实际上,这个版本的运行速度几乎是三元版本的两倍快!(至少在Firefox 8上是如此):http://jsperf.com/max-min-vs-ternary - James Allardice
这个问题并不要求效率,如果你想要效率,你会喜欢这样的东西: ratio = Math.max(input.h/input.w, 1/input.h/input.w); - Bart Calixto
新版Chrome的优化真是太神奇了,使得Min Max成为最快的:D - Bart Calixto
显示剩余5条评论

2

更小并不一定更快:

var ratio, input = {w:100, h:50};
ratio = input.w <= input.h ? input.h / input.w : input.w / input.h;

2

您好

ratio = Math.max(input.w, input.h) / Math.min(input.w, input.h)

这不是效率更低吗?因为它要比较两次数字。 - Luchian Grigore
是的,那是真的,但就个人而言(除了像动画这样的密集操作),我不会担心几微秒。 - Alex K.

1
你可以使用三元运算符:
var ratio = (input.w <= input.h ? (input.h / input.w) : (input.w / input.h));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接