Javascript Math.min和Math.max不适用于大(浮点)数
这与JavaScript如何处理大(浮点)数字有关 指的是可能的最高数字。在下面的例子中,我想通过一种方法绕过它来获得最小值和最大值Javascript Math.min和Math.max不适用于大(浮点)数,javascript,Javascript,这与JavaScript如何处理大(浮点)数字有关 指的是可能的最高数字。在下面的例子中,我想通过一种方法绕过它来获得最小值和最大值 var lower=Math.min(1314729829902636741472982995395415); 控制台日志(最低)您可以尝试将数字转换为: 然后使用以下方法查找最小值和最大值: 常量n1=BigInt(“131472982990263674”); 常数n2=BigInt(“131472982995395415”); 函数BigIntMinAnd
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
- 您是否有两个字符串,并试图按它们所代表的数字对它们进行排序
如果是,则取决于您想要支持的符号
如果您只想支持整数的十进制表示法(没有科学的表示法,如
),那么您可以简单地切掉前导零,并按字典顺序将字符串与JavaScript中的123e4
进行比较
如果您希望支持任意精度的十进制表示法(包括非整数和科学表示法),并且希望保持1.00000000000000001和1.00000000000000002之间的区别,那么您可能需要一个通用的任意精度十进制算术库>函数strmin(x,y){返回x
strmin(“13147298299023674”、“131472982995395415”) '131472982990263674' - 您正在尝试对可能超过2的整数进行算术运算吗⁵³,并且需要精确计算,要求精度>53位
如果是这样,您可能需要比JavaScript数字本身提供的精度更高或任意精度的算法,比如最近添加到JavaScript中的bigint
如果你只需要53位多一点的精度,就像超越初等函数的数值算法中经常出现的那样,还有一个问题:一个双二进制64位数字是和,这能回答你的问题吗?如果您没有访问本机BigInt的权限,请使用BigInt库。不,我不想知道最大的数字。老兄,这是一个艰难的人群。对这个问题已经投了反对票。很清楚我想要的是什么。Math.*方法仅适用于小于或等于Number.MAX\u SAFE\u INTEGER的值。如果您想在BigInt上操作,如果BigInt本机不可用,您可以使用as polyfill“我不想完全理解它。”但您也不想拒绝理解它。
也有同样的问题,请使用正确的符号…当OP说“因为我不能使用BigInt函数,因为它没有暴露在我的版本中”,我猜他们的意思是他们不能使用BigInt,因为它在他们的版本中不受支持environment@ASDFGerte我的错!我会选择例如BigInt(131472982990263674)
(131472982990263674n
literal),但这至少有效。谢谢你的努力,里卡多。不幸的是,BigInt
对我不可用。BigInt
const n1 = BigInt("131472982990263674"); // or const n1 = 131472982990263674n; const n2 = BigInt("131472982995395415"); // or const n1 = 131472982995395415n;