我想使用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)
有更好的方法吗?
答案 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)
这是最佳方法:
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);
}