Java将长时间转换为货币,为什么会有1美分的差异,以及什么';将这么长的货币兑换成货币的安全方法是什么?

Java将长时间转换为货币,为什么会有1美分的差异,以及什么';将这么长的货币兑换成货币的安全方法是什么?,java,Java,下面是我将长(美分)转换为美元的代码,但是,有1美分的差异 我期望的答案是:$12345678913456.47,但输出是$12345678913456.48 public static void main(String[] args) { long l = 12345678912345647L; double d = l / 100.00; NumberFormat formatter = NumberFormat.getCurrencyInstance();

下面是我将长(美分)转换为美元的代码,但是,有1美分的差异

我期望的答案是:
$12345678913456.47
,但输出是
$12345678913456.48

public static void main(String[] args) {
    long l = 12345678912345647L;    
    double d = l / 100.00;
    NumberFormat formatter = NumberFormat.getCurrencyInstance();
    System.out.println(formatter.format(d));
}

它是这样四舍五入的,因为你得到的是一个长整数除以一个数字到小数点后2位的结果,然后它被存储在双精度中。如果您想在不进行四舍五入的情况下获取数字,请尝试除以100.000或用双l替换长l。

对于大于约70万亿的数字,应使用BigDecimal保持准确

public static void main(String[] args) {
        BigDecimal l = new BigDecimal("12345678912345647");
        BigDecimal d = l.divide(new BigDecimal("100.00"));
        NumberFormat formatter = NumberFormat.getCurrencyInstance();

        System.out.println(formatter.format(d));
    }

可能是因为数字不能无损存储在
double
中。答案只能精确到大约70美元trillion@Dici否,使用
BigDecimal
,不使用double,您就可以将其用于所有操作,并且不必在长字符串double/BigDecimal之间切换。@Tom BigDecimal实际上只受内存的限制。@Tom本页总结了我们讨论过的一些要点:我尝试了两种解决方案,但都不起作用。@KaiLiu所以您尝试了我的代码,并且一次成功“错误?”迪恩·科克利说,我试过他的两种解决方案,但都不管用。我试过你的,它成功了,我投了你的票。文本
100.00
100.000
存储相同,因为它们都是
double
,并且
double
类型不包括原始文本中小数位数的指示器。这个解决方案肯定是不正确的。我有点理解为什么这会被否决(没有解释),但同时。请:我只想知道为什么。至少解释一下。我试过这个解决方案,效果很好。
BigDecimal
可以用来存钱。它对于任何有限的小数位数都是完全精确的,并且它只受您拥有的内存量的限制。除了可能的性能外,没有任何理由支持
long
而不是
BigDecimal
。实际上,
BigDecimal
long
更安全,因为您永远不会得到整数溢出。“它只受您拥有的内存量的限制”-通常是正确的,但即使您拥有无限内存,它仍然是有限的,因为它由数组支持,并且使用
int
进行索引(另请参见)。标记。这个答案解决了问题,而不是[重复]的问题。