NumberFormat.getCurrencyInstance()将所有内容都归零?

时间:2014-04-21 09:02:05

标签: java android currency number-formatting

我已经为此工作了好几个小时,无法找到解决方案......

当我使用此代码时:

 NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance(Locale.US);
 System.out.println(currencyFormatter.format(12385748375889879879894375893475984.03));

它给了我输出:$ 12,385,748,375,889,900,000,000,000,000,000,000,000.00

问题是什么?我给它一个双倍值,它应该能够包含比我提供的数字大得多的数字,但是它给了我所有这些无用的零...有谁知道为什么和我能做些什么来解决它?

3 个答案:

答案 0 :(得分:2)

问题不在于您使用的double大小,而是精度double只能存储15-16位精度,即使它可以容纳的数字远大于10 16

如果您需要精确的十进制表示形式 - 特别是如果您将其用于货币值 - 则应使用BigDecimal。示例代码:

import java.text.*;
import java.math.*;
import java.util.*;

public class Test {
    public static void main(String[] args) {
        NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance(Locale.US);
        BigDecimal value = new BigDecimal("12385748375889879879894375893475984.03");
        System.out.println(currencyFormatter.format(value));
    }
}

输出:

$12,385,748,375,889,879,879,894,375,893,475,984.03

对于记录,double字面值12385748375889879879894375893475984.03的完全值为12,385,748,375,889,879,000,357,561,111,150,592。

答案 1 :(得分:1)

双倍的确可以保持这么大的数量。不幸的是,它无法保持其中一个精度。

范围是可以用类型表示的最高和最低值,precision是可以存储的位数。

底线是双精度范围约为10 +/- 308 但只有大约15个十进制数字的精度。 Wikipedia page也有一些有用的信息。

作为修复,您应该查看Java BigDecimal类型,因为它具有任意精度。

答案 2 :(得分:0)

使用以下代码,在netbeans IDE中检查并正常工作

 NumberFormat currencyFormatter1 = NumberFormat.getCurrencyInstance(Locale.US);
        BigDecimal data= new BigDecimal("12385748375889879879894375893475984.03");
        System.out.println(currencyFormatter1.format(data));