繁体   English   中英

double类的parseDouble增加了额外的零

[英]parseDouble of Double class adds extra zero

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

当我想以美元显示分值时,上面的代码完全正常。 例如,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

任何线索为什么会这样?

double类的parseDouble增加了额外的零

Java 1.4到6中有一个错误ID:4428022 ,这意味着它增加了一个你不需要的额外零。 仅在值0.001到0.009时发生这种情况。 Java 7没有这个bug。

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

在Java 6打印

0.0010 0.0020 0.0030 0.0040 0.0050 0.0060 0.0070 0.0080 0.0090

但在Java 7打印

0.001 0.002 0.003 0.004 0.005 0.006 0.007 0.008 0.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;
}

假设两位小数。

double类的parseDouble增加了额外的零

不,不。 您用来格式化 double的方法就是这样做。 双打不包含尾随小数零。 它们不包含小数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM