【问题标题】:JavaScript: Decimal ValuesJavaScript:十进制值
【发布时间】:2010-08-11 02:58:23
【问题描述】:

我可以在 JavaScript 中使用什么作为十进制类型?它不受支持 (0.1 + 0.2 !== 0.3),我需要它来表示银行/金融应用程序中的确切值。请参阅 The State and Future of JavaScript 了解 JavaScript 背后的脏细节以及它(缺乏)对十进制算术的支持。

“十进制”是指:

  1. 无限范围和任意精度(如 Java 中的 BigDecimal),或
  2. 范围和精度有限,但适用于财务计算(如 C# 中的 decimal)。

那么,有哪些库或解决方案可用于处理十进制值?谢谢!

【问题讨论】:

  • @TimAbell 已修复,现在链接指向 YT 上的视频。

标签: javascript decimal


【解决方案1】:

通常建议1将钱处理为代表美分数量的整数:2572 cents 而不是25.72 dollar。这是为了避免您提到的浮点运算问题。幸运的是浮点整数运算是精确的,因此可以通过缩放来避免十进制表示错误。


1道格拉斯·克罗克福德:JavaScript: The Good Parts: Appendix A - Awful Parts (page 105)

【讨论】:

【解决方案2】:

Javascript 确实支持浮点数。但无论如何,对于财务记录,最简单的实现就是将您的值存储在标准整数中。您可以声明一个整数来表示以美分为单位的金额,也可以声明两个整数,一个代表美元,一个代表美分。

因此,在第一种技术中,18.57 美元将变为 1857 美分,在第二种技术中将变为 18 美元和 57 美分。

这具有完全准确的额外优势,因为整数纯粹作为唯一的二进制表示形式存储,因此不会出现舍入错误。

【讨论】:

  • 是的,JavaScript 具有二进制浮点,这对于 99% 使用 JavaScript 的应用程序来说是一个糟糕的选择。是否存在任何对我来说抽象小数概念的 JavaScript 库?
  • 像我的例子一样将它存储为整数不是更简单吗?由于架构如何表示浮点,所有十进制实现都会具有固有的不准确性。不用担心溢出,即使是美国国债也可以整齐地放入 long 类型的 64 位 int 中。
  • JavaScript 的浮点整数部分小于 64 位。
  • @Razor:“由于架构表示浮点的方式,所有十进制实现都会存在固有的不准确性。”不是全部。一个真正的“十进制”实现可以(并且可能必须)做 Java 的 BigDecimal 类所做的事情:实际上将数据存储为一串数字,我们编写和思考它的方式,加上一个比例指示器,所以它知道在哪里小数点是。对于大多数人可能处理的数字领域中的金钱,存储美分数字就可以了。但对于通用的“十进制”类型,这就是需要的那种东西......
  • @Crowder x86 架构可以长时间使用浮点小数(每个小数位一个半字节)。
【解决方案3】:

也看看BigNumberthat post

【讨论】:

  • 光是看那段代码就想哭。虽然很有趣,但不能使用常规运算符+ - / * 等很糟糕
【解决方案4】:

似乎以下库在 js(节点和浏览器)中实现了十进制: https://npmjs.org/package/jsdecimal

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 2018-07-26
    • 2015-10-29
    • 2015-11-11
    相关资源
    最近更新 更多