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