小编Mar*_*ell的帖子

为浮点比较选择 Epsilon 值

我的团队正在使用金融软件,该软件在 C# 浮点数加倍时公开货币价值。有时,我们需要比较这些值以查看它们是否等于零,或者是否落入特定限制。当我注意到这个逻辑中的意外行为时,我很快了解到浮点双精度中固有的舍入误差(例如 1.1 + 2.2 = 3.3000000000000003)。到目前为止,我主要使用 C# 小数来表示货币值。

我的团队决定使用 epsilon 值方法来解决这个问题。本质上,当您比较两个数字时,如果这两个数字之间的差小于 epsilon,则认为它们相等。我们以如下文所述的类似方式实现了这种方法:https : //www.codeproject.com/Articles/383871/Demystify-Csharp-floating-point-equality-and-relat

我们的挑战是确定 epsilon 的适当值。我们的货币价值在小数点右侧最多可以有 3 位数字(比例 = 3)。这意味着我们可以使用的最大 epsilon 是 .0001(任何更大的数字和第三位数字都会被忽略)。由于 epsilon 值应该很小,我们决定将它再移一位小数点到 0.00001(为了安全,你可以这么说)。C# double 的精度至少为 15 位,所以我相信如果小数点左边的数字小于或等于 10 位(15 - 5 = 10,其中 5 是小数点右边的小数位数,epsilon 的位数),我相信这个值应该有效)。用 10 位数字,我们可以将值表示为十亿,最高可达 9,999,999,999.999。我们可能有数亿的数字,但我们预计不会达到数十亿,所以这个限制就足够了。

我选择这个 epsilon 值的理由是否正确?我找到了很多讨论这种方法的资源,但我找不到很多提供选择 epsilon 指导的资源。

c# double epsilon

5
推荐指数
1
解决办法
1685
查看次数

标签 统计

c# ×1

double ×1

epsilon ×1