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

在javascript中,将整数转换为数字的小数部分最有效的方法是什么?,javascript,node.js,integer,decimal,mantissa,Javascript,Node.js,Integer,Decimal,Mantissa,我想使用javascript将整数转换为数字的小数部分 例如: 10030 ->0.10030 10030->0.10030 123->0.123 我想出了两种方法: var convertIntegerPartToFractionalPart1 = function(integerPart) { var fractionalPart = integerPart; while(fractionalPart > 1) { fractionalPa

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

例如:

10030 ->0.10030
  • 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);
};
Converter IntegerPartToFractionalPart1不能生成100%准确的结果,例如132232被转换为0.132232000000000002。但是,convertIntegerPartToFractionalPart1的速度是我的MacBookPro上node.js下convertIntegerPartToFractionalPart2的两倍多。(100万次运行ConvertIntegerPart到部件1需要46毫秒,100万次运行ConvertIntegerPart到部件2需要96毫秒)

有更好的方法吗?

试试这个:

function cvt3(n) {
  return n / Math.pow(10, Math.ceil(Math.log(n)/Math.LN10));
}
由于二进制浮点的性质(我认为),结果仍然可能不精确。但只做一个部门可能会有所帮助。对于较小的数字,您的迭代可能同样好,而且更快

console.log( cvt3(132232) ); // 0.132232 
编辑味精先生的版本更快

试试这个:

function cvt3(n) {
  return n / Math.pow(10, Math.ceil(Math.log(n)/Math.LN10));
}
由于二进制浮点的性质(我认为),结果仍然可能不精确。但只做一个部门可能会有所帮助。对于较小的数字,您的迭代可能同样好,而且更快

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

编辑味精先生的版本更快

我首先不想回答,因为Pointys的解决方案似乎要优雅得多

但在做了一次测试后,我在chrome上的数学解慢了70%

function cnvrt3 (n) {
  return n / Math.pow(10,(""+n).length)
}
cnvrt3(132232)//0.132232 
这和用铸造法测定十的幂是一样的


注意:由于精度0.132232实际上不是
0.132232
。虽然最有可能的是您正在寻找的值,但我首先不想回答,因为Pointys的解决方案似乎要优雅得多

但在做了一次测试后,我在chrome上的数学解慢了70%

function cnvrt3 (n) {
  return n / Math.pow(10,(""+n).length)
}
cnvrt3(132232)//0.132232 
这和用铸造法测定十的幂是一样的


注意:由于精度0.132232实际上不是
0.132232
。虽然最有可能的是您正在查找的值,但您不会使用尾随的零来维护数字,如您的示例所示:

10030 ->0.10030
但可以在字符串前面加一个点:

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

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

10030 ->0.10030
但可以在字符串前面加一个点:

'.'+String(10030)-> '.10030'
以下是实现这一目标的最佳方法:

函数ab(){
var a=566123;
var len=a.toString().length;
var小数点=1;
对于(变量i=0;i
以下是实现这一目标的最佳方法:

函数ab(){
var a=566123;
var len=a.toString().length;
var小数点=1;
对于(变量i=0;i
方法1中的观察结果在阅读后会很清楚,您可以这样做:
partialpart=integerPart/(10^ceil(log10(integerPart))
[注意这是伪代码,因为您必须在javascrit中基于自然日志执行自己的log10函数,并使用
数学。
进行lib调用]。我怀疑最终,这将不如你的选项1那么好。因此,如果你更关心时间,我的投票将是选项1,如果你关心结果是否完美,我的投票将是选项2@devnull感谢您的链接。@mbrach这样做有助于获得更大的整数,但总会有问题(正如devnull指出的)@Pointy,是的,我同意。我在评论中说,它最终可能不会比选项1(释义)更好。方法1中的观察结果在阅读后会很清楚,你可以这样做:
partialpart=integerPart/(10^ceil(log10(integerPart)))
[注意,这是伪代码,因为您必须基于javascrit中的自然日志执行自己的log10函数,并使用
Math.
进行lib调用]。我怀疑最终,这将不如你的选项1好。因此,如果你更关心时间,我的投票将是选项1,如果你关心结果是否完美,我的投票将是选项2。:@devnull感谢链接。@Mbrach这样做有助于一些更大的整数,但总会有问题(正如devnull指出的)@尖刻,是的,我同意。我在评论中说,它最终可能不会比选项1(释义)好。你应该总是被整数除,所以我不认为这是一个重要的问题。通常,你只看到浮点数被多次除或乘的问题,所以(在大多数情况下)这不应该是一个问题。@Qantas94Heavy,但是迭代除以10的方法引入了一个伪影。@Qantas94Heavy…但可能是因为10被分割成一个非整数。它被多次执行。第一次之后,它是一个浮点除法。所以我认为pow10方法在这方面可能更好。它消除了迭代方差……我忘记了JavaScript中数字表示的基本部分。事实上,对于大量的除法,情况确实如此——我再次证明是错误的。
Math.log(10)/Math.log(2);/3.3219280948873626
你应该总是被一个整数除,所以我认为这不是一个重要的问题。通常,你只会看到浮点数被多次除或乘的问题,所以(在大多数情况下)这不应该是一个问题。@Qantas94Heavy,但是迭代除以10的方法引入了一个工件。@Qantas94Heavy…但可能是因为10被划分为一个非整数。它被划分了多次。第一次之后,它是一个浮点数