Javascript Math.min和Math.max不适用于大(浮点)数

Javascript Math.min和Math.max不适用于大(浮点)数,javascript,Javascript,这与JavaScript如何处理大(浮点)数字有关 指的是可能的最高数字。在下面的例子中,我想通过一种方法绕过它来获得最小值和最大值 var lower=Math.min(1314729829902636741472982995395415); 控制台日志(最低)您可以尝试将数字转换为: 然后使用以下方法查找最小值和最大值: 常量n1=BigInt(“131472982990263674”); 常数n2=BigInt(“131472982995395415”); 函数BigIntMinAnd

这与JavaScript如何处理大(浮点)数字有关

指的是可能的最高数字。在下面的例子中,我想通过一种方法绕过它来获得最小值和最大值

var lower=Math.min(1314729829902636741472982995395415);

控制台日志(最低)您可以尝试将数字转换为:

然后使用以下方法查找最小值和最大值:

常量n1=BigInt(“131472982990263674”); 常数n2=BigInt(“131472982995395415”); 函数BigIntMinAndMax(…args){ 返回args.reduce(([min,max],e)=>{ 返回[ emax?e:max, ]; },[args[0],args[0]]; }; 常数[min,max]=BigIntMinAndMax(n1,n2); log(`Min:${Min}`);
log(`Max:${Max}`)
Math.min
Math.max
工作正常。

在JavaScript程序中写入
131472982990263674
时,它将四舍五入到最接近的IEEE 754二进制64浮点数,即131472982990263680

以十六进制或二进制编写,您可以看到131472982990263674=0x1d315fb40b2157a=0b111010011000101111110100000011001000001010101111010需要56位精度来表示。 如果仅用53位精度将其四舍五入到最接近的数字,则得到的结果是0b111010011000101111110100000011001000001010110000000=0x1d315fb40b21580=131472982990263680(有效位以粗体显示)

类似地,当您使用JavaScript编写
131472982995395415
时,返回的是131472982995395410

因此,当您编写代码
Math.min(131472982990263674、131472982995395415)
时,将数字131472982990263680和131472982995395410传递到
Math.min
函数中。 有鉴于此,
Math.min
返回131472982990263680也就不足为奇了

>131472982990263674
131472982990263680
> 131472982995395415
131472982995395410
>数学最小值(1314729829902636741472982995395415)
131472982990263680

你最初的目标是什么还不清楚

  • 您是否有两个JavaScript数字作为开始,您是否试图找到最小值或最大值

    如果是这样,
    Math.min
    Math.max
    是正确的选择

  • 您是否有两个字符串,并试图按它们所代表的数字对它们进行排序

    如果是,则取决于您想要支持的符号

    如果您只想支持整数的十进制表示法(没有科学的表示法,如
    123e4
    ),那么您可以简单地切掉前导零,并按字典顺序将字符串与JavaScript中的
    进行比较

    >函数strmin(x,y){返回xstrmin(“13147298299023674”、“131472982995395415”)
    '131472982990263674'
    
    如果您希望支持任意精度的十进制表示法(包括非整数和科学表示法),并且希望保持1.00000000000000001和1.00000000000000002之间的区别,那么您可能需要一个通用的任意精度十进制算术库

  • 您正在尝试对可能超过2的整数进行算术运算吗⁵³,并且需要精确计算,要求精度>53位

    如果是这样,您可能需要比JavaScript数字本身提供的精度更高或任意精度的算法,比如最近添加到JavaScript中的bigint


    如果你只需要53位多一点的精度,就像超越初等函数的数值算法中经常出现的那样,还有一个问题:一个双二进制64位数字是和,这能回答你的问题吗?如果您没有访问本机BigInt的权限,请使用BigInt库。不,我不想知道最大的数字。老兄,这是一个艰难的人群。对这个问题已经投了反对票。很清楚我想要的是什么。Math.*方法仅适用于小于或等于Number.MAX\u SAFE\u INTEGER的值。如果您想在BigInt上操作,如果BigInt本机不可用,您可以使用as polyfill“我不想完全理解它。”但您也不想拒绝理解它。
    BigInt(131472982990263674)
    也有同样的问题,请使用正确的符号…当OP说“因为我不能使用BigInt函数,因为它没有暴露在我的版本中”,我猜他们的意思是他们不能使用BigInt,因为它在他们的版本中不受支持environment@ASDFGerte我的错!我会选择例如
    131472982990263674n
    BigInt
    literal),但这至少有效。谢谢你的努力,里卡多。不幸的是,
    BigInt
    对我不可用。
    const n1 = BigInt("131472982990263674"); // or const n1 = 131472982990263674n;
    const n2 = BigInt("131472982995395415"); // or const n1 = 131472982995395415n;