- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直听说由于浮点不准确,您应该使用货币类别。然而,令人惊讶的是,很难找到任何浮点不准确实际上导致错误结果的例子。
我选择的编程语言是 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/
笙歌 痞性. 剩余 青怏 洒脱 现实 搁浅° 软萌 路途 娼妓 离骚 逐你 微尘 迷魂 ▼ 扎心 堇夏 残年っ ╭淡妆╮ 24K.纯疯 隐痛
我正在尝试不费吹灰之力地实现完全有效的持久性无知。不过我有很多问题: 最简单的选项 这真的很简单——可以像在 SOA 中那样使用 Spring Data 注释对实体进行注释(但让它们真正执行逻辑)?除
我想完成一项简单的任务。 我在可变宽度容器中有一个图像。 容器的宽度可以为 300、400、700 或 900 像素。这是通过媒体查询完成的图像应占据该容器的所有宽度。所以它也将是 300、400、7
我在使用 Storyboards AutoRotation 和 iPhone 时遇到问题。我已经将一个非常简单的项目与 3 个 View Controller 放在一起,并将其上传到 gitHub 以
我是一名优秀的程序员,十分优秀!