AlmostEqual2sComplement或BigDecimal Scaling

时间:2009-01-12 05:34:39

标签: java types floating-point

使用Java:

我读的浮点值比较越多,我就越迷失。如果货币通常会被四舍五入,那么您更喜欢什么?使用Epsilon或大比例与缩放比较?

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

2 个答案:

答案 0 :(得分:1)

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

这实际上取决于你对这些数字的处理方式。如果您只是添加或减少,则必须处理个数字,以使浮点错误累积到数据范围为0.01。

让我解释一下:假设你的浮点数有17位有效数字。这意味着您的数字最大为49999.99的错误可能约为0.000000000001。您将不得不为该累积误差添加约100亿个数字以达到1美分。乘法和除法会更快地累积该错误,但仍需要一段时间。

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

答案 1 :(得分:1)

此外,在处理货币时,没有理由不能简单地存储代表美分而不是美元的整数,这样您就可以有效地使用定点表示。 例如 $ 4.09存储为409,依此类推。 (您也可以选择存储十分之一的分数 4090或其他一些常量分数精度。)您将能够无限次地加减相加而不会丢失精度。

对于感兴趣的计算,使用浮点数执行计算,然后在存储之前简单地舍入到必要的精度。利息计算本身将具有必要的精确度,并且您将在每个期间始终舍入到相同的小数位数,这通常是您在财务计算中所需要的(我从未见过真正希望跟踪$ 0.00001的机构)一个支付期到下一个 - 由于法律原因,他们将把书翻到一定的精确度。)

普通签名 int 存储美分将让您代表最高$ 21,474,836.47。您可以使用来存储$ 92,233,720,368,547,758.07。如果要处理超过数十亿的货币单位(用Zim美元代表美国预算?),请使用BigDecimal。

您可以在此处了解有关浮点比较的更多信息: What Every Computer Scientist Should Know About Floating-Point Arithmetic