javascript - Decimal.js 乘法方法不能正常工作
问题描述
我遇到了 JavaScript 中的浮点精度问题,为了解决这个问题,我找到了 Decimal.js 或 BigNumber.js 之类的库。在我尝试以下方法之前,它对我来说工作正常。
我一共有60个,份额10个。所以份额的百分比是10/60*100(16.666666666666666667%)。
现在我想知道 360 的 16.666666666666666667% 是 60(计算器),但由于某种原因,我使用 Decimal.js 得到 60.000000000000000001。
var percentage = (Decimal(10).div(60)).mul(100);
console.log(percentage.toString()); // 16.666666666666666667
var share = (Decimal(360).mul(percentage)).div(100);
console.log(share.toString()); // 60.000000000000000001
我预计会得到 60,但得到了这个。我是遗漏了什么还是图书馆的问题,因为我有点困惑,这不适用于为此类问题创建的图书馆。
解决方案
你的计算器和你的图书馆都是四舍五入的。
将 16.666666666666666667 乘以 60 的确切结果是 1000.00000000000000002。如果手动将 166.66666666666666667 乘以 6,则从 6*7 = 2 开始,进位为 4。之后,当您向左工作时,您将乘以 6 * 6,进位为 4。结果为 0,进位为 4。最后 6*1+4 为 0,进位为 1。
您缺少的是舍入误差不是二进制浮点所独有的。任何 radix X 分数表示,包括小数,只能精确表示其分母可以是 X 的幂的有理数。对于小数,X 是 10,对于任何整数对 A和 1/6 不能精确表示为 A/10 B B.
除非你去一个通用的有理数库,否则你必须处理舍入误差。即使是可以表示任何有理数(仅受内存限制)的库,也必须舍入无理数,例如大多数平方根。
推荐阅读
- apollo-client - Apollo Client 3:替换 Query 对象的 nuggets 字段时可能会丢失缓存数据
- python - 如何更改 tkinter 中所有小部件的颜色主题?
- reactjs - 单击使用react将数据从数据库导出到excel表
- python - 为什么 Django Rest Framework 在我过滤时会在我的 URL 上添加斜杠?
- excel - 用户定义的函数如何不能返回准确的数据?
- python - Pyvista 访问 VTK 文件值
- wcf - 总是得到“System.Net.WebException:请求被中止:无法创建 SSL/TLS 安全通道。” 每当我们进行部署时
- python-3.x - Tkinter 按钮
- mapping - Tableau 将属性映射到唯一标识符
- amazon-web-services - 如何让 EC2 实例监听两个端口并显示两个不同的 HTML 页面