在javascript中将整数转换为数字的小数部分的最有效方法是什么?

时间:2013-05-24 13:19:21

标签: javascript node.js integer decimal mantissa

我想使用javascript将整数转换为数字的小数部分。

例如:

  • 10030 - > 0.10030

  • 123 - > 0.123

我想出了两种方法:

var convertIntegerPartToFractionalPart1 = function(integerPart) {
    var fractionalPart = integerPart;

    while(fractionalPart > 1) {
        fractionalPart = fractionalPart / 10;
    }
    return fractionalPart;
};

var convertIntegerPartToFractionalPart2 = function(integerPart) {
    return parseFloat('.' + integerPart);
};

convertIntegerPartToFractionalPart1不会产生100%准确的结果,例如132232转换为0.13223200000000002。但是,convertIntegerPartToFractionalPart1的速度是我的MacBook Pro上node.js下的convertIntegerPartToFractionalPart2的两倍多。 (1000000运行convertIntegerPartToFractionalPart1需要46ms,100万运行convertIntegerPartToFractionalPart2需要96ms)

有更好的方法吗?

4 个答案:

答案 0 :(得分:2)

试试这个:

function cvt3(n) {
  return n / Math.pow(10, Math.ceil(Math.log(n)/Math.LN10));
}

由于二进制浮点的性质(我认为),结果仍然可能不准确。但只做一个部门可能有所帮助。对于较小的数字,您的迭代可能同样好,而且速度更快。

console.log( cvt3(132232) ); // 0.132232 

编辑 Monosodium Glutamate先生的版本更快!

答案 1 :(得分:2)

我首先不想回答,因为Pointys解决方案看起来更优雅。

但是在做了Jsperf之后,我发现数学解决方案对我来说对我来说慢了约70%。

function cnvrt3 (n) {
  return n / Math.pow(10,(""+n).length)
}
cnvrt3(132232)//0.132232 

因此使用铸造确定10的力量是相同的

注意由于floating point精度0.132232并非0.132232。虽然很可能是您正在寻找的价值

答案 2 :(得分:0)

您不会使用尾随零维护数字,如示例所示:

10030 ->0.10030

但你可以在字符串前加一个点:

'.'+String(10030)-> '.10030'

答案 3 :(得分:0)

  

这是最佳方法:

Demo Here

    function ab() {
        var a = 566123;

        var len = a.toString().length;
        var decimalPoints = 1;

        for (var i = 0; i < len; i++) {
            decimalPoints = decimalPoints * 10;
        }

        var number = parseInt(a) / decimalPoints;
        alert(number);
    }