我们应该在Java中使用double或BigDecimal进行计算吗?
与双倍相比,BigDecimal的性能开销是多少?
答案 0 :(得分:5)
对于一般浮点计算,您应该使用double
。如果你完全确定你确实需要任意精度算术(大多数应用程序没有),那么你可以考虑BigDecimal
。
对于double
足够精确的任何应用程序,您会发现BigDecimal
将明显优于double
(更不用说更容易使用了)。
更新:您评论了另一个答案,您希望将其用于与财务相关的应用程序。这是您实际应该考虑使用BigDecimal
的区域之一,否则您可能会从double
计算中获得意外的舍入效果。此外,double
值的精确度有限,而且您无法在数百万美元的同时准确跟踪便士。
答案 1 :(得分:3)
与双倍相比,BigDecimal的性能开销是多少?
很多。例如,两个双精度的乘法是单个机器指令。将两个BigDecimal相乘可能至少有50条机器指令,其复杂度为O(N * M)
,其中M
和N
是用于表示这两个数字的字节数。
但是,如果您的应用程序要求计算“十进制正确”,那么您需要接受开销。
然而(#2)......偶数BigDecimal
无法使用实数准确度进行此计算:
1/3 + 1/3 + 1/3 -> ?
答案 2 :(得分:3)
对于严肃的财务应用,BigDecimal是必须的。
取决于您需要多少位数,您可以使用长和小数因素进行可视化。
答案 3 :(得分:1)
一如既往:这取决于。
如果您需要精确度(即使是“小”数字,例如表示金额时),请使用BigDecimal
。
在某些科学应用中,double
可能是更好的选择。
答案 4 :(得分:0)
即使在金融领域,我们也无法在不知道哪个领域的情况下回答例如,如果您进行数十亿美元的货币转换,转换率可能为5 d.p.你可能有双重问题。然而,只需简单地添加和减去余额就可以了。
如果你不需要以分数/分钱的分数工作,也许整数类型可能更合适,同样取决于所涉及数字的大小。
答案 5 :(得分:-2)
字节= 8 bit
短= 2 byte
= 16 bit
int = 4 byte
= 32 bit
long = 8 byte
= 64 bit
float = 4 byte
= 32 bit
double = 8 byte
= 64 bit
简单计算:
2字节= 1 short
2 int = 1 long
2 short = 1 int
float = int
2 float = double