关于node.js:Nodejs中小数计算溢出问题以及如何解决

翻译平台有一个类似度检测的性能,其中有一个计算两个字符串类似度的函数后果发现两个齐全截然不同的字符串返回的类似度居然为 ,依据 余弦类似度算法[1] 失去 ,小于用户传递的最小类似度阈值1,因而归到了低类似度的文本中了。
为什么会这样:

因为计算机执行的是二进制,并且js中数字都是浮点数示意的,并且规定了是 IEEE754的规范的双精度浮点数。

IEEE 754 规定了两种根本浮点格局:单精度和双精度。

单精度格局:具备24 位有效数字精度(蕴含符号),并总共占用32 位。

双精度格局:具备53 位有效数字精度(蕴含符号),并总共占用64 位。

再次深刻一下:

咱们应用 0.1 + 0.2进行推算

0.1转换为二进制 => 0.0001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1100 …

0.2转换为二进制 => 0.0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 …

相加 => 0.0100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100

依照IEEE 754规范保留 52位,按权相加法, 0舍1入 来取值 => sum ≈ 0.30000000000000004

解决方案:

  1. tofixed

长处:简略粗犷

毛病:不会四舍五入

如下图:

  1. 小数->整数->小数 (即十进制的先左移而后右移)
  2. 能够应用第三方库

Math.js 用于 JavaScript 和 Node.js 的扩大数学库。 它具备反对符号计算的灵便表达式解析器,大量内置函数和常量,并提供了集成的解决方案来解决不同的数据类型,例如数字,大数,复数,分数,单位和矩阵。弱小且易于应用。

decimal.js JavaScript 的任意精度的十进制类型。

big.js 一个小型,疾速,易于应用的库,用于任意精度的十进制算术运算。

从周下载量来说无脑选big.js, 用法也非常简单.

参考资料 :

  1. https://www.cnblogs.com/airne…

2.https://www.withyou.ink/bignu…

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理