当前位置: 首页 > 知识库问答 >
问题:

比较Javascript中的十进制字符串

储承
2023-03-14

我有两个字符串的输入,每个字符串以十进制格式表示一个非负有理数。

给定这两个字符串,我想检查由x表示的数值是否大于由y表示的数值。

这两个值可以非常大,也可以扩展到非常高的精度(即小数点后的许多数字)。

因此,我不能依赖Number(x)

相反,我实现了以下功能:

function isLarger(x, y) {
    const xParts = x.split(".").concat("");
    const yParts = y.split(".").concat("");
    xParts[0] = xParts[0].padStart(yParts[0].length, "0");
    yParts[0] = yParts[0].padStart(xParts[0].length, "0");
    xParts[1] = xParts[1].padEnd  (yParts[1].length, "0");
    yParts[1] = yParts[1].padEnd  (xParts[1].length, "0");
    return xParts.join("").localeCompare(yParts.join("")) == 1;
}

我进行了广泛的测试,通过生成随机输入xy,并将isLarger(x, y)的结果与表达式的值进行比较数字(x)

当然,由于上面提到的原因,我不能依赖表达式Number(x)的值

所以我希望对上面的功能有一些反馈:

  • 里面有什么注意事项吗

共有2个答案

司易安
2023-03-14

我对你的测试方法有一个警告。根据我对问题和评论的理解,我实施了它。为了测试测试方法,我在isLarger中引入了一个严重错误,完全忽略了小数点后的部分。

即使有这样一个严重的错误,我在10,000,000次运行中也有5次失败,相当于每百万次运行中有0.5次失败。

我认为你需要一种测试方法,可以在数字部分匹配的情况下进行更多的测试。

这是我的计划:

function isLarger(x, y) {
    const xParts = x.split(".").concat("");
    const yParts = y.split(".").concat("");
    xParts[0] = xParts[0].padStart(yParts[0].length, "0");
    yParts[0] = yParts[0].padStart(xParts[0].length, "0");
    xParts[1] = xParts[1].padEnd(yParts[1].length, "0");
    yParts[1] = yParts[1].padEnd(xParts[1].length, "0");
    xParts[1] = "";
    yParts[1] = "";
    return xParts.join("").localeCompare(yParts.join("")) == 1;
}

function testIt(x, y) {
    const actual = isLarger(x, y);
    const expected = Number(x) > Number(y);
    if (actual != expected) {
        console.log("x=" + x + " y=" + y + " actual " + actual + " expected "
                + expected);
    }
}

function randAsString() {
    return (Math.random() * 1000000).toString();
}

testIt("3.3", "3.2");
for (var i = 0; i < 10000000; i++) {
    testIt(randAsString(), randAsString());
}
闻深
2023-03-14

我看不出您的解决方案中有任何警告,但最后一行不必要地复杂。而不是

返回xParts.join("). localeCompare(yParts.join ("")) == 1;

您可以简单地使用:

<代码>返回xParts。联接(“”)

如果您可以绝对确定您的输入永远不会包含带有不必要的前导零的数字(例如001而不是1)或以点开头的十进制数字(例如。.1而不是0.1)您可以通过首先比较整数部分中的位数来显着简化比较。

整数部分的位数越多表示数字越大,位数越少表示数字越小。

当整数位数相同时,简单的字符串比较基本上就足够了。只有一个填充操作是必需的-如果x等于y,但包含更多的尾随零,则需要用尾随零填充y,以避免得到真实的结果(因为211.00

function isLarger(x, y) {
    const xIntLength = x.search(/\.|$/); /* Finds position of . or end of string */
    const yIntLength = y.search(/\.|$/); /* Finds position of . or end of string */
    /* Compare lengths of int part */
    if (xIntLength !== yIntLength) {
      return xIntLength > yIntLength;
    } else {
    /* Add decimal point to Y if not present and add  trailing zeros
       because otherwise eg. '2.00' > '2.0' would return true */
      const yWithDecimalPoint = y.includes('.') ? y : y + '.';
      const paddedY = yWithDecimalPoint.padEnd(x.length,'0');
      return x > paddedY;
    }
}
 类似资料:
  • 问题内容: 我正在使用Java中的Chord协议实现简单的DHT。详细信息并不重要,但是我要坚持的事情是我需要对字符串进行哈希处理,然后查看一个哈希字符串是否“小于”另一个。 我有一些代码可以使用SHA1计算哈希,该哈希返回40位长的十六进制字符串(在Java中为String类型),例如: 但是我需要能够比较其中的两个,以便例如: 小于: 这是值的完整范围,因为40位数的字符串实际上代表01234

  • 问题内容: 我会马上追逐。现在,我正在开发基于Web的应用程序。它具有基于PHP REST的体系结构,可提供XML文档。在许多这些文档中,属性是十六进制编码的图片字符串。 在客户端,jQuery AJAX获取其中包含图片的XML文档。我需要在某些标签中显示上述图片。但是,我缺乏有关此类方法的知识,因此在这里寻求帮助。 目标:以十六进制或base64 >>> HTML显示的图像的JavaScript

  • 如何比较字符串二进制(而不是字母数字)?? Torrent规格: 键必须是字符串,并且以排序顺序出现(排序为原始字符串,而不是字母数字)。应该使用二进制比较,而不是特定于区域性的“自然”比较来比较字符串。 所以我需要按键对口供进行排序...但我没有这个规格。解释..有人吗? 更新:http://docs.oracle.com/cd/b19306_01/server.102/b14225/ch5li

  • 我在客户端将一些参数存储在HTML中,然后需要将它们作为整数进行比较。不幸的是,我遇到了一个我无法解释的严重错误。bug似乎是我的JS将参数作为字符串而不是整数读取,导致我的整数比较失败。 我生成了一个错误的小例子,我也无法解释。运行时,以下返回“true”:

  • 大家好,我是JavaScript的新手,我发现了一个基本问题: 当我在Python中使用这段代码时: 我得到 当我在JavaScript中执行同样的操作时,我会得到错误: 如何获得与Python相似的结果?

  • 问题内容: 我听说散列(即将字符串或对象转换为数字)用于字符串等,因为比较数字比字符串更容易。如果为真,这是什么原因? 问题答案: 不一定是这种情况,但大多数时候可能是这样。 请考虑以下情况: 我想比较字符串“ apples”和“ oranges”。如果我只想确定“ apples” ==“ oranges”,我只需要比较每个字符串的第一个字符:’a’!=’o’=>“ apples”!=“ oran