Javascript 如何实现parseFloat

Javascript 如何实现parseFloat,javascript,string,casting,floating-point,parsefloat,Javascript,String,Casting,Floating Point,Parsefloat,想知道如何实现parseFloat的低级实现,例如它在JavaScript中的工作方式 我所看到的所有类型转换示例都在某个时候使用它,例如,或。另一方面,有一个文件是相当大的 想知道它是一个非常复杂的函数还是有一个简单的实现。只是想知道如果太复杂,它是如何工作的 也许更接近它。parseFloat的基本数学非常简单,只需要小学的算术。如果我们有一个十进制数字,我们可以通过以下方式轻松地将其转换为二进制: 将整数部分除以二。余数0或1成为我们正在构建的二进制数字中的一位。商替换整数部分,我们重复,

想知道如何实现parseFloat的低级实现,例如它在JavaScript中的工作方式

我所看到的所有类型转换示例都在某个时候使用它,例如,或。另一方面,有一个文件是相当大的

想知道它是一个非常复杂的函数还是有一个简单的实现。只是想知道如果太复杂,它是如何工作的


也许更接近它。

parseFloat的基本数学非常简单,只需要小学的算术。如果我们有一个十进制数字,我们可以通过以下方式轻松地将其转换为二进制:

将整数部分除以二。余数0或1成为我们正在构建的二进制数字中的一位。商替换整数部分,我们重复,直到整数部分为零。例如,从13开始,我们除以得到6的商和1的余数。然后我们除以6得到商3和余数0。然后是1和1,然后是0和1,我们完成了。我们产生的位,以相反的顺序,是1101,这是13的二进制数字。 将次整数部分乘以2。整数部分成为二进制数字中的另一位。重复次整数部分,直到它为零,或者我们有足够的位来确定结果。例如,对于.1875,我们乘以2得到.375,其整数部分为0。再次加倍生成.75,它的整数部分再次为0。接下来我们得到1.5,它的整数部分是1。现在,当次整数部分.5加倍时,我们得到次整数部分为0的1。新的位是.0011。 为了确定浮点数,我们需要从二进制数字的前导1位开始的有效位中尽可能多的位,并且为了舍入的目的,我们需要知道下一位以及之后的位是否为非零。关于额外位的信息告诉我们源值和适合有效位的位之间的差是零,不是零,而是小于适合的最低位的1/2,正好是最低位的1/2,还是大于最低位的1/2。此信息足以决定在任何常用舍入模式下是向上舍入还是向下舍入

上面的信息告诉您在算法的第二部分中何时停止乘法。一旦你有了所有的有效位,再加上一个,再加上一个非零位或次整数部分为零,你就有了你需要的所有信息,并且可以停止

然后根据常用的舍入规则将位舍入到最接近的偶数,将位放入浮点对象的有效位,并设置指数以记录二进制数字前导位的位置,从而构造浮点值

有一些修饰用于检查溢出或下溢或处理低于正常值。然而,基本的算术只是小学的算术

出现问题的原因是上面使用了任意大小的数组,并且不支持使用“e”来引入十进制指数的科学记数法,如“2.79e34”。上述算法要求我们保留所有所需的空间,以便对给定长度的十进制数字进行乘除。通常,我们不想这样做,我们也希望更快的算法。请注意,支持上述算法的科学表示法还需要任意大小的数组。要填写“2.79e34”的十进制数字,我们必须用“2790000000000000000000000”填充数组

因此,算法被开发出来,以更智能的方式进行转换。我们可以做精确的计算,而不是做精确的计算,但要仔细分析产生的误差,以确保误差太小,无法得到正确的答案。此外,可以提前准备数据,例如包含十次幂信息的表格,这样我们就可以得到二进制形式的十次幂的近似值,而无需在每次执行转换时计算它们


将十进制转换为二进制浮点的复杂性来自于对快速且使用有限资源的算法的渴望。允许某些错误会导致需要数学证明以确保计算正确,而试图使例程快速且资源高效会导致人们想到使用聪明的技术,这会变得棘手且需要证明。

答案可能会是高度特定于语言的。但基本上,如果从字符串abc123123abc开始,通常会首先以字符串123123结束。然后,如果你想用它作为一个数字,你可能需要执行一些强制转换操作。那是哪种语言?David Gay的dtoa.c,你链接到它,它是某种事实上的标准实现。这是一个
lso用于各种其他语言。这是复杂的,但必须如此。查看更多信息:。这是一个很好的问题。为什么它被否决了lol。现在的社区是非常值得怀疑的…不知道是否正在这样做。