Javascript科学记数法覆盖

Posted

技术标签:

【中文标题】Javascript科学记数法覆盖【英文标题】:Javasctipt scientific notation override 【发布时间】:2013-02-20 06:36:29 【问题描述】:

我正在尝试编写一个代码来计算给定数字中 5 个连续数字的最大乘积。 我尝试将数字转换为数组的代码,然后对数组进行 for 循环,将每 5 个连续的单个数字相乘并将其与最后一个数字进行比较。 一旦我通过函数的数字超过 21 位,我猜计算机会将数字转换为科学计数法,这会导致整个函数关闭。 这是代码,它在 21 位上运行良好:

function func(value)
    var number = value;
    console.log(number);
    var output = [];
    sNumber = number.toString();
    console.log(sNumber);
    for (var i = 0; i < sNumber.length; i++) 
        output.push(+sNumber.charAt(i));
    
    console.log(output);
    var productToCompare;
    var largerProduct = 0;
    for (var j = 0; j < output.length - 4; j++) 
        productToCompare = output[j]*output[j+1]*output[j+2]*output[j+3]*output[j+4];
        console.log(productToCompare);
        if (productToCompare > largerProduct) 
            largerProduct = productToCompare;
        
    
    return largerProduct;


func(13245678901234567890);

当我添加另一个数字时:

func(123465789012345678901);

它开始使用科学计数法。 这是由于 javascript 的性质、我使用的计算机、编译器还是什么?

【问题讨论】:

为什么不将输入的数字保存为字符串? @6502 我正在尝试输入一个大数字,然后将每个数字视为一个独立的数字。因此 12345 将被视为 5 个单独的数字:1、2、3、4、5。 【参考方案1】:

与许多事情一样,您会遇到 JavaScript 中使用的基本数据类型的限制。在这种情况下,它似乎是整数类型的限制。

数字 13245678901234567890 适合 64 位整数。添加另一个数字会将其推入无法以这种方式表示的范围,因此需要浮点数。

在不同的 JavaScript 引擎中测试时,您可能会得到不同的值。超过 2147483648 的任何内容都可能最终转换为浮点值。

每当您进行数学计算时,请尽量避免对它们进行字符串计算。数字的字符串表示相当随意,不可信。

您应该做的是除以 10 的某个因子,然后对 10 取模以获得各个数字。

【讨论】:

在 64 位 Safari 中似乎是这种情况。 13245678901234567890 最终显示为 13245678901234567000。 除法和使用模数听起来像是我应该走的路,但有没有办法自信地覆盖科学记数法?我意识到我可以使用 .toPrecsion,但由于我正在处理一个我无法使用的数字:value.toPrecision(value.length)。我可以简单地计算数字的数量,但它可能会因大数字而变得烦人。我还尝试了 .toPrecision(25) 或示例,在 16 位数字之后,计算机似乎正在自行组成数字...... 如果你决心打破非常大的数字,你可以尝试使用a bignum library for JavaScript。请记住,这些通常比原生类型慢得多,但在您的情况下,性能可能是可以接受的。 如果你有点模糊,别忘了阅读floating point numbers。如果你不understand their limitations,你会遇到麻烦。请记住,浮点值始终被视为近似值,因此其中一部分将被“弥补”。 @tadman 关于计算数字中的数字的问题,我意识到我可以简单地分配一个变量来将数字转换为字符串并使用 .length 关闭该变量。感谢所有链接,我一定会调查它们。

以上是关于Javascript科学记数法覆盖的主要内容,如果未能解决你的问题,请参考以下文章

11 JavaScript Number对象&科学记数法&范围&进制转换&溢出Infinity&NaN

什么是决策科学

JavaScript中科学计数法转化为数值字符串形式

Snowflake Javascript UDF:嵌套在作为科学计数法发出的对象中的十进制值

Struts 2 - Double 与科学记数法问题

Propel: 由Node.js之父创建的JavaScript科学计算库