2

我想使用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。但是,在我的 MacBook Pro 上的 node.js 下,convertIntegerPartToFractionalPart1 的速度是 convertIntegerPartToFractionalPart2 的两倍多。(convertIntegerPartToFractionalPart1 的 1000000 次运行耗时 46 毫秒,convertIntegerPartToFractionalPart2 的 1000000 次运行耗时 96 毫秒)

有没有更好的方法来做到这一点?

4

4 回答 4

2

尝试这个:

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

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

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

味精先生编辑的版本更快!

于 2013-05-24T13:32:19.027 回答
2

我首先不想回答,因为 Pointys 解决方案似乎更加优雅。

但是在做了一个Jsperf之后,结果发现数学解决方案对我来说在 chrome 上慢了大约 70%。

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

所以继承人相同使用铸造来确定十的幂

注意由于浮点精度 0.132232 不是真的0.132232。虽然很可能是您正在寻找的价值

于 2013-05-24T13:51:55.937 回答
0

您不会保留带有尾随零的数字,如您的示例所示:

10030 ->0.10030

但您可以在字符串前面添加一个点:

'.'+String(10030)-> '.10030'
于 2013-05-24T14:11:20.490 回答
0

这是最好的方法:

在这里演示

    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);
    }
于 2013-05-24T14:17:33.737 回答