我已经为此工作了好几个小时,无法找到解决方案......
当我使用此代码时:
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
问题是什么?我给它一个双倍值,它应该能够包含比我提供的数字大得多的数字,但是它给了我所有这些无用的零...有谁知道为什么和我能做些什么来解决它?
答案 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));