javascript - 如何实现parseFloat

标签 javascript string casting floating-point parsefloat

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

我见过的所有有关类型转换的示例都在某个时候使用它,例如thisthisthis。另一方面,this文件很大(来自here)。

想知道这只是一个非常复杂的功能还是一个简单的实现。如果它太复杂,通常只是想知道它是如何工作的。

也许this更接近它。

最佳答案

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


将整数部分除以2。余数(零或一)变成我们正在构建的二进制数字中的一位。商替换整数部分,然后重复执行直到整数部分为零。例如,从13开始,我们除以得到6的商和1的余数。然后,我们除以6得到3的商与0的余数。然后1和1,然后0和1,我们是完成。我们产生的位相反的顺序是1101,这是13的二进制数。
子整数部分乘以2。整数部分成为二进制数字中的另一位。重复子整数部分,直到它为零,或者我们有足够的位来确定结果。例如,对于.1875,我们乘以2得到.375,其整数部分为0。再次加倍时产生.75,其整数部分为0。接下来我们得到1.5,其整数部分为0。 1.现在,当子整数部分.5加倍时,我们得到1,子整数部分为0。新位为.0011。


为了确定浮点数,我们需要与有效位数相符的位数(从二进制数的前1位开始),并且为了取整,我们需要知道下一位以及该位之后是否还有其他位非零。 (有关额外位的信息告诉我们,源值和适合有效位数的位之间的差是否为零,不是零,但小于适合的最低位的1/2,恰好是最低位的1/2 ,或大于最低位的1/2。此信息足以决定在任何常规舍入模式下是向上舍入还是向下舍入。)

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

然后,您可以根据所使用的舍入规则对位进行四舍五入来构建浮点值(通常是四舍五入到偶数),将这些位放入浮点对象的有效位数,然后设置记录二进制数字的前导位位置的指数。

有一些装饰可用于检查上溢或下溢或处理次标准值。但是,基本算术只是小学算术。

由于上面使用了任意大小的数组,并且因为它不支持像“ 2.79e34”那样使用“ e”表示十进制指数的科学记法,因此出现了问题。上面的算法要求我们保持给定给定长度的十进制数字乘以和除的所有空间。通常,我们不想这样做,我们也想要更快的算法。请注意,使用上述算法支持科学计数法也将需要任意大小的数组。要填充“ 2.79e34”的十进制数字,我们必须用“ 27900000000000000000000000000000000000000”填充数组。

因此,开发了算法以更智能的方式进行转换。除了进行精确的计算之外,我们可以进行精确的计算,但是要仔细分析所产生的错误,以确保这些错误太小而无法阻止我们获得正确的答案。另外,可以预先准备数据,例如具有关于10的幂的信息的表,这样我们就已经具有二进制的10的幂的近似值,而不必在每次执行转换时都进行计算。

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

关于javascript - 如何实现parseFloat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51551379/

相关文章:

c# - 从字符串中删除 Markdown 标签

java - 关于 Java 动态转换的大学任务

javascript - 创建新的多维数组时出现问题

Javascript - 将字符串转换为关联数组并按值汇总

javascript - Javascript 中字符串中的数字数组

java - 用不允许出现的次数替换字符串中的所有连续重复项

c# - 如何按特殊顺序提取括号之间的文本?

c# - 如何使用不同类型进行类型转换

sql - Postgres : How to store bytea as value in hstore?

javascript - 未捕获的网络错误 : Failed to execute 'importScripts' on 'WorkerGlobalScope'