gpt4 book ai didi

java - Double 类的 parseDouble 添加额外的零

转载 作者:行者123 更新时间:2023-11-29 03:37:38 26 4
gpt4 key购买 nike

public static double centsToDollars(Number cents, int precision) {
return BigDecimal.valueOf(cents.doubleValue() / 100).setScale(precision, RoundingMode.DOWN).doubleValue();
}

当我想以美元显示美分值(value)时,上面的代码完全可以正常工作。例如,对于 1 美分,它返回 0.01 美元。

assertEquals("$0.01", FormatUtils.centsToDollars(1, 3)) 
assertEquals("$0.012", FormatUtils.centsToDollars(1.2345, 3))
assertEquals("$0.327", FormatUtils.centsToDollars(32.7, 3))

但我想不通,为什么 FormatUtils.centsToDollars(0.65, 3) 返回 $0.0060。我希望收到 0.006。最新的零关于什么?

更新

看起来问题的根本原因是调用 BigDecimaldoubleValue()

System.out.println(Double.parseDouble("0.006")); 

System.out.println(BigDecimal.valueOf(0.006).doubleValue());

为我返回 0.0060

知道为什么会这样吗?

最佳答案

parseDouble of Double class adds extra zero

有一个bug id:4428022在 Java 1.4 到 6 中,这意味着它会添加一个您不需要的额外零。这仅发生在值 0.001 到 0.009 时。 Java 7 没有这个错误。

for (int i = 1; i <= 9; i++)
System.out.println(i / 1000.0);

在 Java 6 中打印

0.00100.00200.00300.00400.00500.00600.00700.00800.0090

但在 Java 7 中打印

0.0010.0020.0030.0040.0050.0060.0070.0080.009


我怀疑 0.65 在现实中实际上略低。当你将它除以 100 时,你会得到类似 0.006499999999999 的值,四舍五入后会下降到 0.006

我怀疑你想要的是

public static String centsToDollars(Number cents, int precision) {
return "$" + BigDecimal.valueOf(cents.doubleValue())
.divide(BigDecimal.valueOf(100))
.setScale(precision, RoundingMode.HALF_UP);
}

尝试

System.out.println(new BigDecimal(0.65 / 100));

我是这样写的

public static String centsToDollars(double cents) {
double rounded = Math.round(cents * 100) / 1e4;
return "$" + rounded;
}

这假设小数点后两位。

关于java - Double 类的 parseDouble 添加额外的零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14661059/

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