返回

文章详情

西班牙商人为GnuCash数据库设计设定了标准

Hacker News2026年6月8日 12:57

2026年6月6日 • 作者:Vitalik 驴屁股为铁路设定了标准。西班牙商人为GnuCash数据库设计设定了标准。概述:1600年代的西班牙商人不想数他们的拇指,这影响了1997年GnuCash的数据库设计选择。就像驴的屁股为铁路设定了标准一样,这种看似奇怪的设计变成了满足人们需求的天才解决方案。 这是这样的一个夜晚。桌子上放着一杯热咖啡。我正在HandsOnMoney中实施商品支持,这在表面上看起来绝对微不足道,但实际上却相当复杂。毕竟,有什么能比货币更简单的呢——有美元和分。存储一个数字并计算总数有什么比这更简单的呢?等等。这里有多个层次…… 第一层。文化。并不是美元总是有100美分。说实话是有的。但其他货币可能没有“美分”或者有一千个“美分”。这些“美分”一般称为“小单位”。以下是一些具体的例子:日本日元没有小单位(由于二战后通货膨胀),科威特第纳尔有一千个小单位(这使得国家可以使用更小的价值增量并保持精准的贸易定价),而比特币则有1亿聪!但等等。甚至还有历史货币——真实的“八分之一”,可以分成8片!所以,1/8的硬币是最小的不可分割单位!这让我们来到了下一个层次——我们到底如何存储它?第二层。软件。计算机对小数不太友好。有些抽象,比如浮点型和双精度型。但它们是近似值,而不是实际的小数。90年代末和2000年代初出现了十进制,这是一个更好的类型;然而,当GnuCash发布时,它可能还不可用。对此已有很多讨论。通常,开发者使用双精度数值类型来记录和存储浮点数。但这种浮点数记录的问题在于它与货币不太兼容。例如,有可能出现这样的情况:1.03 - 0.42 = 0.6100000000000001,这似乎是一个微不足道的四舍五入错误。但在大量交易中,这个四舍五入错误会累积,最终你会看到一个奇怪的账户余额。此外,货币具有固定的精确度和特定的四舍五入规则。因此,软件工程师们在这个地雷上踩了很多次,最终他们发展出一个通用模式——货币。简单来说,就是将小单位存储为整数,因为计算机对整数非常擅长。所以,我们提到的不是记录$5.23,而是将钱存储为523美分。问题解决了吗?不,正如你所预期的那样——没那么简单。第三层。历史。这不只是关于钱。好吧,确实是。但不仅仅是钱,也是关于商品。简而言之,钱是一种商品。人们交易各种商品——货币、股票和基金。这种概括需要我们回顾过去。好吧……像1998年那样狂欢。 1998年,是GnuCash的首次发布年(当时名为xacc)。互联网泡沫的财富不断涌入,处处都是派对……但最重要的是——纽约证券交易所的报价是分数,而不是十进制!GnuCash在2001年美国交易所完成十进制化之前发布。为什么?回到时间机器……像16世纪一样交易。 纽约证券交易所在200多年前成立时,采用了16世纪的西班牙交易系统,基于分数,因为商人用手指计算黄金硬币,省略了拇指。这就是为什么最小的股票增量是1/8美元。这不是技术决定,而是拇指的决定。(来源 - Investopedia)好吧,数完16世纪的手指后。让我们回到2026年。 第四层。数据工程。在2026年,一切以十进制交易。我们开始数手指和拇指。GnuCash选择存储分数的设计是过去的遗物吗?它已经导致了一个bug,2.7.8版本的登记显示商品账户的价格是分数的。这有点让人困惑,因为我的大脑太慢,无法处理例如1250除以2449的结果。见 https://imgur.com/SA3Kkbh https://bugzilla.gnome.org/show_bug.cgi?id=794755 基本上是的。GnuCash满是过去的小怪癖(它仍然支持意大利里拉,而里拉在1999年被欧元取代!)。但这种看似过时的设计决策在现代世界中依然运作良好。考虑这个例子:如果我在2011年以90美分买入1个比特币。在我的GnuCash帐簿中,我记录为:账户 借方 贷方 2011年 支票账户 9 / 10美分 比特币 1比特币 现在在2026年,我可以出售我持有的一个小部分,并按照比特币的小单位(聪)进行定价。我可以轻松地在商品编辑器中将比特币的精度从1调整到100,000,000,GnuCash依然会毫无问题地计算余额。例如,这里我正在2026年出售3个聪:账户 借方 贷方 2026年 支票账户 $1 比特币 3 / 100,000,000 比特币 这很简单。

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡