首页 > 解决方案 > 为什么语句 `0 < 0.5 < 1` 会减少为假?

问题描述

我最近发现了ECMAScript Spec,我可以用它来回答我已经有Math.random()一段时间的问题了;即它是否会在0没有Math.floor().

ECMAScript 规范指定 ,0 <= Math.random() < 1由于某种原因,它与其他任何人都不同。我跳到控制台并运行了一个测试,然后将其保存在我的笔记中,但注意到该语句减少为false.

下面是一个函数,它测试我认为可能导致这个谎言的比较语句的所有内容。我调用该函数两次以生成两个布尔值数组,结果似乎从字面上暗示了以下语句:0 <= Math.random() < 1- 并且仅此语句,返回FALSE它应该返回的位置TRUE。尤其是当您考虑奖金回合时,我测试了完全相同的语句,但在末尾添加了额外的比较,并且它也返回true

function getTruths( a, b, c ) {
  
  return [
    
    a + 1 < b + 1,
    a + 1 < c + 1,
    b + 1 < c + 1,
    a + 1 < b + 1 < c + 1,
    
    a + 0 < b + 0,
    a + 0 < c + 0,
    b + 0 < c + 0,
    a + 0 < b + 0 < c + 0
    
  ];
  
}

function demonstrate() {
  
  // array of truth
  console.log( getTruths( 0, 1, 2 ) );
  
  // array of lies
  console.log( getTruths( 0, 0.5, 1 ) );
  
  // bonus round
  return [ 0 < 0.5 < 1 < 1.5 ];
  
}

demonstrate();

所以我做了一些更多的采摘,并了解到不仅仅是这样。似乎aandb实际上可以是任何低于 1 且等于或大于 0 的值,只要b它仍然大于a,并且当然c仍然等于1...并且给定这些参数,无论如何,返回还在FALSE。如果你添加1到所有东西,但突然你又恢复了良好状态,就像上面提供的功能一样。

无论如何,有人可以向我解释一下吗?谢谢。

标签: javascriptboolean

解决方案


a < b < c

被解释为

(a < b) < c

来自关系运算符之类的结果值<是一个布尔值,真或假。如果c是数字,则该布尔值将转换为数字,1 ( true) 或 0 ( false)。因此c与 0 或 1 进行比较,而不是与 或 的值进行a比较b

b写“严格介于ac”之间的正确方法是

a < b && b < c

推荐阅读