Java DecimalFormat-保留可变数量尾随零的十进制格式

Java DecimalFormat-保留可变数量尾随零的十进制格式,java,double,bigdecimal,decimalformat,Java,Double,Bigdecimal,Decimalformat,在使用DecimalFormat格式化为字符串时,我需要保留数字的小数位数,特别是对于尾随的零。我需要使用DecimalFormat,因为我还需要避免对大数字使用科学记数法,正如所见,这是最好的方法。但是,正如您在那篇文章中看到的,所提供的代码也删除了尾随的零,而我希望保留它们 1.00 -> "1.00" 1.000 -> "1.000" 我见过很多涉及固定小数位数的问题,但在我的情况下,我需要考虑可变小数位数。我研究了小数位数的计算,但由于我的输入也可以是双精度的(除了BigD

在使用DecimalFormat格式化为字符串时,我需要保留数字的小数位数,特别是对于尾随的零。我需要使用DecimalFormat,因为我还需要避免对大数字使用科学记数法,正如所见,这是最好的方法。但是,正如您在那篇文章中看到的,所提供的代码也删除了尾随的零,而我希望保留它们

1.00 -> "1.00"
1.000 -> "1.000"
我见过很多涉及固定小数位数的问题,但在我的情况下,我需要考虑可变小数位数。我研究了小数位数的计算,但由于我的输入也可以是双精度的(除了BigDecimal),似乎没有可靠的方法来计算所有数字小数点后的数字。Double.toString()不起作用,因为对于非常小和非常大的数字,Double会变成指数表示法。请参阅以获取有关为什么难以计算双精度小数位数的更多信息。

是否“保留”尾随的零

double
值不知道要看到多少个尾随零。它只是一个数字,
1.00
1.000
是同一个数字,即数字
1
。您所要求的不能用
双精度
值来完成

现在,
BigDecimal
确实记住了尾随的零的数量,因此如果要打印一个
BigDecimal
值,保留数字的刻度,但确保它永远不会以科学记数法打印,请不要使用
十进制格式,而是使用
toPlainString()

返回此
BigDecimal
的字符串表示形式,不带指数字段


更新

如果要打印一个包含所需小数位数(即无尾随零)的
double
值,并且要确保它从不以科学记数法打印,请使用
DecimalFormat
格式,该格式具有非常高的
最大整数位数
和非常高的
setMaximumFractionDigits

“非常高”表示值超出了
double
的范围,因此
999
是一个很好的“整数”,尽管
330
足够高

试验

输出

0.0123400=0.01234=0.01234
123400.00  = 123400.0  = 123400
NaN=NaN=�
-无穷大=-无穷大=-∞
+无穷大=无穷大=∞
最小正常值=2.2250738585072014E-308=0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022250738585072014
最小值=4.9E-324=0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049
最大值=1.7976931348623157E308=17976931348623157000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

要么是
double
(无精度,总是近似值),要么是
BigDecimal

使用BigDecimal作为新的BigDecimal(“2.00”)
定义两位数的正确比例(精度)。可以通过编程方式设置比例

对于数据库和计算(如金融),BigDecimal很好

BigDecimal.toPlainString()
中可以避免输出的科学表示

对于
double
可以使用

s = String.format("%10.2f", 13.5789); // "   13.58"
所有这些都有一个小数点,没有数千个分隔符

国际化(本地化)软件将使用带有区域设置(显式或默认平台区域设置)的
消息格式


不幸的是,输入也可能是双倍的。因此,如果我尝试了您用值1.2概括的BigDecimal方法,这里是输出:new BigDecimal(1.2)。toPlainString()的结果是1.199999999999555910790149937383830547332763671875'@adiadi不使用构造函数。改用。javadoc甚至告诉您:这通常是将
double
(或
float
)转换为
BigDecimal
的首选方法,因为返回的值等于使用
double.toString(double)
的结果构造
BigDecimal
。实际上
1.0
1.000
1
在技术上用浮点二进制表示时是不同的值,例如
double
float
@JarrodRoberson
1.0
1.000
1
在浮点二进制中是完全相同的值,例如
double
float
,例如,作为一个
浮点数
所有三个都是字节
3f 80 00
。它们在
BigDecimal
中不同,但肯定与浮点值相同。关于使用BigDecimal:我无法确定双精度输入的正确比例。在所有其他情况下,我都可以这样做,但如果它是一个双精度,我没有办法这样做,因为正如你所说,双精度有一个近似值。假设输入值为1.200。我需要把它转换成字符串。我怎样才能在不硬编码刻度的情况下使用十进制格式来实现这一点?@adiadi You
s = String.format("%10.2f", 13.5789); // "   13.58"
Locale.setDefault(new Locale("bg", "BG"));
s = MessageFormat.format("Number: {0, number, #.##}, "
            + "amount: {1, number, currency}",
            42.125, 19.99);