2013-01-11 72 views
2

可能重复:
Why not use Double or Float to represent currency?数字格式

我学习Java,所以请多多包涵这样一个简单的问题。当给定一个计算,以计算利益,我有这样的代码输入:

public double calculateTotal(double rate, int n) 
{ 
    amount = amount * Math.pow((1+rate), (n/12)); 
    return amount; 
} 

这将返回我正在寻找的答案,但不断增加0.000000000001到年底。 我将如何解决这个问题?一位朋友建议了一种叫数字格式的东西,但我找不到解决方案。

+8

如果这是出于货币目的,请改用'BigDecimal'。 – Swapnil

+3

请参阅[这里](http://stackoverflow.com/questions/3730019/why-not-use-double-or-float-to-represent-currency)为什么使用货币双重不是一个好主意。 – Jonathan

+1

'n/12'是一个整数运算,所以对于'n = 1',它将为零,而不是'1/12'。否则,'double'永远不会100%精确。你可以使用'DecimalFormat'来表示你的数字。 – jlordo

回答

1

此问题与广为人知的浮点计算问题有关。

解决的办法之一可能是使用import java.math.BigDecimal

编辑

Java不允许覆盖运营商所以要加BigDecimal的唯一途径š在一起是使用add方法例如(假设你的量是BigDecimal。记住,BigDecimal为不可变的那么无论是从calculateTotal需要返回到被分配回ammount

// you assign result to amount outside calculateTotal 
amount.add(new BigDecimal(Math.pow((1+rate), (n/12)))); 

// you assign sum to amount inside calculateTotal 
amount = amount.add(new BigDecimal(Math.pow((1+rate), (n/12)))); 
+0

我导入了java.math.BigDecimal。不用找了。所以我将一些数据类型更改为BigDecimal,现在编译器抱怨不允许BigDecimals添加在一起的不正确的运算符类型。 D = – cbatothinkofname

+0

@cbatothinkofname你应该看看SO上的这个问题。 [添加BigDecimal](http://stackoverflow.com/questions/1846900/addition-for-bigdecimal) – Smit

+0

输入了最新的反馈,现在它给了我一个完全不同的答案,这是错误的,然后仍然给我长的小数。 – cbatothinkofname

1

由于这是之前提到的BigDecimal好选项,如果你需要更好的双精度的精度。

有很好的方法做与BigDecimal s舍入。基本上你必须指定BigDecimal实例。看看此示例代码:

BigDecimal decimalOne = new BigDecimal(0.1950); 
BigDecimal decimalTwo = decimalOne.setScale(2, BigDecimal.ROUND_HALF_DOWN); 
BigDecimal decimalThree = decimalOne.setScale(4, BigDecimal.ROUND_HALF_DOWN); 

System.out.println("decimalOne: " + decimalOne); 
System.out.println("decimalTwo: " + decimalTwo); 
System.out.println("decimalThree: " + decimalThree); 

的Java 7将打印这样的事情:

decimalOne: 0.195000000000000006661338147750939242541790008544921875 
decimalTwo: 0.20 
decimalThree: 0.1950 

请注意,BigDecimal实例是不可变的,这就是为什么你必须的setScale分配结果新实例(decimalOne不会更改)。


在许多金融体系double s的不用于存储货币信息;代替使用具有特定精度的long类型。对于精度2,值100将是1.00,122将是1.22等。该方法简化并计算了计算结果,但对所有系统都不好。然而,为了简化这个问题,我不会深入探讨这个问题。