【问题标题】:Get least significant digit including its value in a JavaScript获取最低有效数字,包括其在 JavaScript 中的值
【发布时间】:2017-12-28 17:17:36
【问题描述】:

我想从 JavaScript 中的数字中提取包括其值在内的最低有效数字(这样不会丢失任何信息)

例如

12.0123323 -> 0.0000003

123299000 -> 9000

123001 -> 1

123001.01 -> 0.01

10000000 -> 10000000

等等……

有没有一种巧妙的方法可以做到这一点?

编辑: 正如人们注意到的那样,由于 Javascript:s 处理数字的方式它不能代表 12.0123323,所以我们假设在那些极端情况下它是一个字符串。

【问题讨论】:

  • 您需要定义“最低有效位”的含义,例如12.0123323 没有准确表示。也许你可以通过一些合理的舍入规则来做到这一点。我会测试默认的toString 是否可以完成这项工作。
  • 你试过什么?这是作业吗?
  • @Cheersandhth.-Alf computerhope.com/jargon/l/leastsd.htm 我明白了,嗯,但是当我在控制台中打印时它仍然显示正确的小数位数。
  • @user1506145:Alf 的意思是 JavaScript 中的浮点值 不能 正好具有 12.0123323 的值。这是因为 JavaScript 使用二进制浮点。 JavaScript 中最接近的浮点值可能是 12.012332300000000628870111540891230106353759765625。但是 JavaScript 可能会默认显示“12.0123323”。 (我不记得 JavaScript 默认用于格式化输出数字的内容。)所以你认为 12.0123323 是 not 12.0123323,真实值的最低有效位是 5。
  • @user1506145:这意味着你必须澄清你的问题。如果您有一个数字(表示数字的字符串)而不是浮点数,您可以检查该字符串以查看最低有效数字是什么。如果你有一个浮点数,那么它要么是一个整数,要么它的最低有效位是 5。(当转换为十进制时,所有二进制小数都以 5 结尾。)如果你知道浮点数实际上来自十进制位数有限的数字,可能会找到原始值的最低有效位。

标签: javascript floating-point numbers


【解决方案1】:

您可以检查该值是否为整数,并选择不同的替换架构以获得正确的最低有效值。

function least(x) {
    return x === Math.floor(x)
        ? +x.toString().replace(/.*(?=[1-9]0*$)/, '')
        : +x.toString().replace(/\d(?=.*[1-9]$)/g, '0');

}

var array = [
        12.0123323, // 0.0000003
        123299000,  // 9000
        123001,     // 1
        123001.01,  // 0.01
        10000000    // 10000000
    ];

console.log(array.map(least));
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    【解决方案2】:
     const least = num => [...num.toString()].reduceRight((res, d, i) => (+res ? (d === "." ? "." : "0") : d) + res, "");
    

    Test Cases

    它基本上从右到左(reduceRight)遍历数字的字符串表示(toString),如果当前结果中已经有一个数字(+res)那么

      d === "." ? "." : "0"
    

    它要么接管点,要么将任何其他数字转换为 0。如果还没有数字 (:),它只会添加当前的 d,并附加已经遍历的部分 + res


    如果你更喜欢可读的代码:

     function least(num){
      var res = "";
      for(var char of num.toString().split("").reverse()){
        if(+res){
          res = (char === "." ? "." : "0") + res;
        } else {
          res = char + res;
        }
      }
      return res;
    }
    

    【讨论】:

      【解决方案3】:
      var foundNonzero = false
      Number("324.034"
      .split('')
      .reverse()
      .map((i)=>{
          if(i==='.') return i
          if(foundNonzero) return '0'
          if(i!=='0'){
              foundNonzero = true 
          }
          return i
      }).reverse().join(''))
      

      【讨论】:

        猜你喜欢
        • 2016-05-13
        • 1970-01-01
        • 1970-01-01
        • 2019-08-24
        • 2020-09-07
        • 1970-01-01
        • 2018-10-25
        • 1970-01-01
        • 2013-01-24
        相关资源
        最近更新 更多