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

53次阅读

共计 875 个字符,预计需要花费 3 分钟才能阅读完成。

翻译平台有一个类似度检测的性能,其中有一个计算两个字符串类似度的函数后果发现两个齐全截然不同的字符串返回的类似度居然为 ,依据 余弦类似度算法[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…

正文完
 0