gpt4 book ai didi

java - Double 数据类型的意外行为

转载 作者:行者123 更新时间:2023-12-02 05:06:54 24 4
gpt4 key购买 nike

这是我正在尝试的一段示例代码。我知道这是因为 double /舍入。但请让我确切地知道发生了什么以及如何克服它。?

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

最佳答案

这是因为 double 表示以 2 为基数的十进制数,而 10 不是 2 的幂。这意味着对于某些值,double 等价物会有所不同。

有两种方法可以解决此问题:

  • 使用BigDecimal;或
  • 将结果四舍五入到您自己“修复” double 的位数。

您可以使用 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);

或者,您可以通过将结果四舍五入到两位有效数字来四舍五入错误。现在,如果您对大量数据执行此操作,则结果不正确的可能性很小(例如,如果乘数大于 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);

然而,不能保证这总是有帮助,正如已经说过的,结果可能会多或少几美分(但仅限于大数字,因此相对误差非常小)。

关于java - Double 数据类型的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27707630/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com