让我们看一下代码片段
double f = .123;
System.out.println(f);
System.out.println(new DecimalFormat(".###").format(f));
因此我们可以使用.###
省略前导零0,但我们必须在小数点/句点之后定义尾随数字。
我想定义可以提供无限制个after-decimal-point
位数的DecimalFormat格式化程序。
我该怎么做?
P.S。
我确实尝试了"."
,但我们没有打印十进制数字。我们可以使用".#*"
答案 0 :(得分:2)
Double是一个有限逼近(64位,包括符号和指数),因此无法完成无限和精确。
使用BigDecimal。 String构造函数将通过字符串获取其精度。
BigDecimal n = new BigDecimal("0.1234567890123456789012345678901234567890");
n = n.multiply(n); // n now has double precision.
String s = n.toPlainString().replaceFirst("^0\\.", "."); // Without exponent.
如果您想要无限制的表示,只需使用toPlainString
即可。
关于在使用正则表达式替换之后,可以使用一段时间之前删除零点。
答案 1 :(得分:1)
您可以将数字转换为字符串并跳过第一个字符:
double f = .123;
System.out.println(Double.toString(f).substring(1));
经过一些研究,我不相信使用DecimalFormat
可以实现这一目标。但是,您建议的".#*"
可能是一个有用的补充。
答案 2 :(得分:1)
由于浮动没有无限制的after-dicimal-points
,只需使用尽可能多的#
。
您还可以将数字转换为字符串并选择要显示的子字符串。
float f = 0.123;
String fs = Float.toString(f);
System.out.println(fs.substring(fs.indexOf('.'), fs.lenght());
如果您事先不知道,如果您的号码只有一个前导零,这也有效。
不幸的是,我不能告诉你这是否也可以使用DecimalFormatter。