【问题标题】:comparing two floats to see if they're both negative, or both positive比较两个浮点数以查看它们是负数还是正数
【发布时间】:2010-01-06 14:49:58
【问题描述】:

嘿伙计们,我有 2 个浮点数,它们都来自输入框。

我需要比较这两个浮点数,如果一个是负数,一个是正数会抛出一个错误。如果它们都是正面的,或者都是负面的,那很好。

有什么想法吗?

谢谢

【问题讨论】:

  • 如果一个是(或两个都是)零怎么办?

标签: javascript floating-point compare


【解决方案1】:

将它们相乘。

如果答案是肯定的,那么它们都是同一个符号。

如果答案是否定的,那么它们的符号相反。

如果答案为零(在某个值范围内以解决舍入误差),那么其中一个或两个都为零,您必须单独检查它们。然后,您必须决定在您的场景中将 0 视为正面还是负面。

【讨论】:

  • 我自己再看一遍,OPs 规则是模棱两可的,因为零既不是 +ve 也不是 -ve。
  • @dotty 是的,它会起作用,而且它是一个简洁的解决方案,除非一个或其他值为零。当只有一个值为零时,您的规则说明了什么?
  • @dotty - 如果它们都为零,那么答案将为零(实际上在零舍入误差内,但这是另一回事)。在任何情况下,零结果意味着您必须单独检查每个输入以查看它是正数还是负数。
  • 不确定,如果值为 0 和 -3,或者 0 和 +3,它会通过吗?
  • 好吧,既然我们谈论的是 IEEE 标准浮点数,我们将 +0 和 -0 作为两个单独的数字......虽然我不确定你如何在不进行类型惩罚和将它们与 int 进行比较(这有一个潜在的问题,即有一些疯狂的平台对 int 和 float 使用不同的字节顺序......)
【解决方案2】:

虽然可以检测产品的符号,但这不是您感兴趣的。特别是如果您要在大量浮点数上使用它(例如检测时间流中的零交叉)。

最简单的方法是准确表达你的要求:a 的符号是否等于 b 的符号?

function samesign( a, b ) {
  var aPositive = a >= 0;
  var bPositive = b >= 0;
  return aPositive == bPositive;
}

或更短:

function samesign( a, b ) { return (a>=0) == (b>=0); }

【讨论】:

  • +1 比乘法更好的解决方案。正如每个人在其他答案中所指出的那样,清晰且没有技巧的编码很重要。除非您有其他问题,例如优化
【解决方案3】:

只需执行以下操作:

if float1*float2<0
    Error

【讨论】:

    【解决方案4】:
    function isSameSign(a,b){
      var r = a*b; 
      return (r >= 0)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-12
      • 1970-01-01
      • 1970-01-01
      • 2018-05-14
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      • 2021-12-09
      相关资源
      最近更新 更多