使用双Java精确计算选项
我试图简要介绍一下JAVA+SQL中的精确计算选项。到目前为止,我发现了以下几种选择:
- 使用替身,接受他们的缺点,不可以李>
- 使用大小数
- 在复杂的公式中使用它们对我来说是有问题的
- 使用字符串。格式/十进制。双打格式
- 我需要对公式中的每个变量进行四舍五入,还是只对结果进行四舍五入,以获得更大的十进制精度李>
- 如何调整李>
- 在SQL中使用计算字段选项。
- 缺点是,我需要动态SQL来从不同的表中提取数据,并在其他计算字段中提取计算字段,这会变得很混乱
还有其他选择吗
问题陈述: 我需要精确的财务计算,包括使用非常大(十亿)和非常小的数字(0.0000004321),以及相互非常相似的值的除法,所以我当然需要BigDecimal的精度
另一方面,我希望保留double函数中的易用性(我使用十进制SQL数据处理数组),因此,类似于:(a[I]-b[I])/b[I]等的计算将在其他计算中进一步使用。我希望用户能够根据需要设计自己的公式(使用常见的数学语句)
我热衷于使用字符串的“格式化”解决方案。格式化,但这会使代码不太可读(对每个变量使用String.format())
非常感谢您对如何处理这些东西的建议
# 1 楼答案
在浮点和双精度中,您无法避免浮点错误。 这里没有免费奶酪——使用BigDecimal
# 2 楼答案
摘自《有效Java》(第二版):
# 3 楼答案
如果我理解您的问题,那么您希望使用比本机Java更精确的数据类型,而不丢失简单的数学语法(例如/+*-等等)。由于Java中不能重载运算符,我认为这是不可能的
# 4 楼答案
无法在
double
上获得BigDecimal
精度double
具有双重精度如果你想保证精确的结果,可以使用
BigDecimal
你可以用一个
long
来存储整数部分,用一个int
来存储小数部分,来创建你自己的变体,但是为什么要重新发明轮子呢任何时间使用
double
都可以避免填充器出现双精度问题。如果你在一个地方使用它们,你也可以在任何地方使用它们即使只使用它们来表示数据库中的数据,也会将数据四舍五入到两倍精度,从而丢失信息