0

比较两个浮点值的更好方法是什么 - 使用 Epsilon 或带有缩放的 Big Decimal 比较?

例如,您的数据范围是 0.00 - 49,999.99?

4

2 回答 2

1

对于 0 到 50000 的 2 个十进制数字的数据范围,我会使用带有 epsilon 的内置类型。

这实际上取决于您对数字的处理方式。如果您只是加或减,则必须处理大量数字才能使浮点误差累积到您的数据范围内的 0.01。

让我解释一下:假设您的浮点数有 17 位有效数字。这意味着您对高达 49999.99 的数字的错误可能约为 0.000000000001。您必须添加大约 100 亿个数字才能使累积误差达到 1 美分。乘法和除法会更快地累积该错误,但仍需要相当长的时间。

如果您不了解它是如何工作的(并且性能不是应用程序中的全部和最终目的),请使用 BigDecimal 以确保安全。内置类型应该快得多。

于 2009-01-12T05:51:49.860 回答
1

此外,在处理货币时,没有理由不能简单地存储表示美分而不是美元的整数,以便有效地获得定点表示。例如$4.09 被存储为 409 等等。(您也可以选择存储十分之一分,4090 或其他一些恒定的小数精度。)您将能够无限次地进行加减运算而不会丢失精度。

对于利息等计算,使用浮点数执行计算,然后在存储之前简单地四舍五入到必要的精度。利息计算本身将具有必要的精度,并且您将始终将每个期间的小数位数四舍五入,这通常是您在财务计算中想要的(我从未见过真正想要跟踪 $0.00001 的机构从一个支付期到下一个支付期——出于法律原因,他们会将账簿四舍五入到某个指定的精度。)

一个普通的已签名int存储美分最多可让您代表 $21,474,836.47 。您可以使用long来存储 $92,233,720,368,547,758.07。要处理超过千万亿的货币单位(以 Zim 美元表示美国预算?),请使用 BigDecimal。

您可以在此处了解有关浮点比较的更多信息: 每位计算机科学家应了解的浮点运算知识

于 2009-01-12T07:52:39.117 回答