我正在做一个算法,检查一个数字是否是大学的质数,但我遇到了一个内涵和计算问题,我需要考虑大的数字。
其中一个问题在BigInt()的支持下得到了解决,但是在小数位数的算术计算中,它最终失去了精度,从而返回了false true。
例如,乘以两个以1,3,7,9结尾的数字,总会得到一个以1,3,7,9结尾的数字,但从3**34开始,计算就开始失去精度。
在JavaScript中有没有解决这个问题的有效方法?
console.log(`
${3**32}, ${BigInt(3**32)}
${3**33}, ${BigInt(3**33)}
${3**34}, ${BigInt(3**34)}
${3**35}, ${BigInt(3**35)}
${3**37}, ${BigInt(3**37)}
${3*1597*3237*5549}, ${BigInt(3*1597*3237*5549)}
${3*1597*3237*5549*13213}, ${BigInt(3*1597*3237*5549*13213)}
${3*1597*3237*5549*13213*4543}, ${BigInt(3*1597*3237*5549*13213*4543)}
`);
发布于 2022-01-27 00:33:26
对于这种类型的操作,建议使用BigInt类型编号。我认为BigInt()只是一种转换方法,但也是一个数值单位。
还必须使用相同的数字格式进行计算,如果除法结果为分数,则将其舍入。
console.log(`
${3n**32n}
${3n**33n}
${3n**34n}
${3n**35n}
${3n**37n}
${3n*1597n*3237n*5549n}
${3n*1597n*3237n*5549n*13213n}
${3n*1597n*3237n*5549n*13213n*4543n}
${1n/3n}
${2n/3n}
`);
发布于 2022-01-26 20:14:32
你可以..。不使用Javascript
除此之外,您还可以使用Mike的ANSI实现任意精度十进制算术decNumber或decFloats包(http://speleotrove.com/decimal/#decNumber),并为其编写Node.js绑定。
迈克·考利肖( Mike )对算术略知一二:
于1998年和1999年担任ECMAScript (JavaScript)国际标准(现为ISO 16262)的项目编辑和技术主席。
从1999年到2009年,他致力于新的十进制算术包(包括IBM的BigDecimal类和decNumber C库),发明了密集的十进制编码,并帮助指定了新的十进制硬件体系结构。他是General算术规范的作者,也是2004年Java 5中包含的十进制算术增强的规范负责人。
Mike支持将新的十进制类型和算法添加到IEEE 754浮点算法标准以及C、C++、COBOL和其他语言(以及硬件)中,并继续积极参与一些标准组织的相关工作,包括ECMA、ISO、ANSI、IEEE、BSI和W3C。自2007年第一次投票以来,他一直担任IEEE 754标准的编辑,并于2008年出版了该标准,并于2011年作为ISO/IEC/IEEE 60559标准的编辑,并是IEEE计算机算术专题讨论会程序委员会的成员。IEEE 754进一步增强,由迈克担任编辑,修订后的标准于2019年发布。
https://stackoverflow.com/questions/70869449
复制相似问题