gpt4 book ai didi

currency - 显示 Money 类需求的现实示例是什么?

转载 作者:行者123 更新时间:2023-12-02 19:46:24 25 4
gpt4 key购买 nike

我一直听说由于浮点不准确,您应该使用货币类别。然而,令人惊讶的是,很难找到任何浮点不准确实际上导致错误结果的例子。

我选择的编程语言是 Python。为了测试结果是否与预期不同,我使用:

expected = '1.23'
result = '{:0.2f}'.format(result)
assert expected == result

因此,虽然以下是浮点不准确的一个很好的示例,但它并不是大多数用例需要使用有理数类(如 Python 分数)的货币类的示例:

a = 10.0
b = 1.2
assert a + b - a == b

我能想到的最好的办法是

result = (a + b - a) * 10**14 - b * 10**14
expected = 0

但是将与金钱相关的东西乘以 10**14 似乎确实是编造的。

现在我想知道是否有任何现实的例子表明需要货币类别,或者是否所有内容都可以通过简单地四舍五入到两位数来“捕获”。

最佳答案

it is astonishingly hard to find any example where floating point inaccuracy actually leads to a wrong result.

我不会说这非常困难。现实世界中一个著名的例子(尽管不涉及金钱)是爱国者导弹系统代码每秒累积的浮点舍入误差为 0.000000095 秒;如果系统不是每五天重新启动一次,它就会关闭几分之一秒。由于它拦截的导弹每秒可移动数千米,因此它会错过。

至少 28 人因该浮点错误而死亡。

我们可以在不危及更多生命的情况下展示爱国者的错误。这是一个 C# 小程序。假设我们要加一毛钱;在出现重大错误之前我们必须添加多少个?

    double sum = 0.0;
long k = 0;
long report = 1;
while (true) {
k += 1;
sum += 0.1;
if (k == report) {
Console.WriteLine($"{k} {k / 10.0 - sum}");
report *= 10;
}
}

让它运行多久都可以。我的机器上的输出开始:

1 0
10 1.11022302462516E-16
100 1.95399252334028E-14
1000 1.406874616805E-12
10000 -1.58820512297098E-10
100000 -1.88483681995422E-08
1000000 -1.33288267534226E-06
10000000 0.00016102462541312
100000000 0.0188705492764711
1000000000 1.25458218157291
10000000000 -163.12445807457

仅经过一亿次计算(即 1000 万美元),我们就已经落后了 2 美分。经过 100 亿次计算,我们损失了 163.12 美元。当然,这只是每笔交易的一个微小错误,也许与 10 亿美元相比,163.12 美元在宏伟的计划中并不是很多钱,但是如果我们无法正确计算 1 亿乘以 0.1,那么我们有没有理由对这个系统产生的任何计算有信心。

误差可能保证为零;为什么您希望误差为零?

练习:您暗示您知道在哪里进行舍入以确保消除此错误。那么:他们去哪里了?

<小时/>

受您的评论启发,一些其他想法:

while I think a decimal data type certainly is required for a money class, I don't think it is enough. I think a money class should also (1) prevent adding non-money numbers (2) prevent adding two different currencies (3) not allow taking the power / roots.

如果您想要的是现实世界中货币错误的示例,其中涉及计量单位未被类型系统捕获,那么这样的示例有很多很多。

我曾经在一家编写检测软件缺陷的软件的公司工作。最神奇的缺陷检查器之一是“剪切和粘贴错误”检测器,它发现了现实世界代码中的缺陷,例如

dollarTot = (euros1 + euros2) * dollarEuroRate;
pesoTot = (euros3 + euros4) * pesoEuroRate;
... dozens more like this...

然后在代码中

dollarTot = (yen1 + yen2) * yenDollarRate;
pesoTot = (yen3 + yen4) * pesoEuroRate;
...

哎呀。

有这个缺陷的主要国际贸易公司调用我们,说下次我们去瑞士时啤酒就在他们身上。

这些示例说明了为什么金融公司对 F# 等语言如此感兴趣,因为它们可以让跟踪类型系统中的属性变得 super 容易

几年前,我在博客上写了一系列关于使用 ML 类型系统来查找实现虚拟机时的错误,其中整数可能意味着十几个不同数据结构的地址,或这些结构的偏移量。它可以快速发现错误,并且运行时开销最小。计量单位类型非常棒,即使对于简单的问题(例如确保不要将美元与日元混淆)也是如此。

关于currency - 显示 Money 类需求的现实示例是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50823645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com