这是我正在尝试的一段代码示例。我知道这是因为双精度/舍入。但请让我确切知道发生了什么以及如何克服它。?
public class DoubleSample {
public static void main(String[] args) {
// TODO Auto-generated method stub
double price1 = 16.99;
double price2 = 12.99;
int multiplier =10000;
double price1updated = price1 * multiplier;
double price2updated = price2 * multiplier;
System.out.println("price1 "+price1updated);
System.out.println("price2 "+price2updated);
}
}
输出
price1 169899.99999999997
price2 129900.0
答案 0 :(得分:2)
这是因为double
表示基数为2的十进制数,10
不是2
的幂。这意味着对于某些值,double
等效值将有所不同。
有两种方法可以解决这个问题:
BigDecimal
;或您可以使用BigDecimal
来解决此问题。在这种情况下,代码将读取如下内容:
BigDecimal price1 = new BigDecimal("16.99");
BigDecimal price2 = new BigDecimal("12.99");
BigDecimal multiplier = new BigDecimal(10000);
BigDecimal price1updated = price1.multiply(multiplier);
BigDecimal price2updated = price2.multiply(multiplier);
System.out.println("price1 "+price1updated);
System.out.println("price2 "+price2updated);
或者,您可以通过将结果四舍五入到例如两位有效数字来舍入错误。现在,如果使用大数字执行此操作,则结果将不正确(例如,如果multiplier
大于1G),则可能性很小。如果您想要对两位数进行舍入,则代码为:
double price1 = 16.99;
double price2 = 12.99;
int multiplier =10000;
double price1updated = Math.round(price1 * multiplier * 100.0d)*0.01d;
double price2updated = Math.round(price2 * multiplier * 100.0d)*0.01d;
System.out.println("price1 "+price1updated);
System.out.println("price2 "+price2updated);
然而,无法保证这将始终有所帮助,正如已经说过的那样,结果可能会增加或减少几美分(但只有大数,所以相对误差非常小)。