我试图弄清楚如何通过String
给出小数来计算有效位数,以便我可以对小数进行计算并使用相同的有效位数打印结果。这是一个SSCCE:
import java.text.DecimalFormat;
import java.text.ParseException;
public class Test {
public static void main(String[] args) {
try {
DecimalFormat df = new DecimalFormat();
String decimal1 = "54.60"; // Decimal is input as a string with a specific number of significant digits.
double d = df.parse(decimal1).doubleValue();
d = d * -1; // Multiply the decimal by -1 (this is why we parsed it, so we could do a calculatin).
System.out.println(df.format(d)); // I need to print this with the same # of significant digits.
} catch (ParseException e) {
e.printStackTrace();
}
}
}
我知道DecimalFormat
是1)告诉程序你打算如何显示你的小数(format()
)和2)告诉程序期望一个字符串表示的十进制格式是什么格式在(parse()
)。但是,有没有办法从解析后的字符串中删除DecimalFormat
,然后使用相同的DecimalFormat
输出一个数字?
答案 0 :(得分:4)
使用BigDecimal:
String decimal1 = "54.60";
BigDecimal bigDecimal = new BigDecimal(decimal1);
BigDecimal negative = bigDecimal.negate(); // negate keeps scale
System.out.println(negative);
或简短版本:
System.out.println((new BigDecimal(decimal1)).negate());
答案 1 :(得分:1)
通过String.indexOf('.')
找到它。
public int findDecimalPlaces (String input) {
int dot = input.indexOf('.');
if (dot < 0)
return 0;
return input.length() - dot - 1;
}
您还可以通过setMinimumFractionDigits()
和setMaximumFractionDigits()
配置DecimalFormat / NumberFormat来设置输出格式,而不必将模式构建为字符串。
答案 2 :(得分:0)
int sigFigs = decimal1.split("\\.")[1].length();
计算小数点右边的字符串长度可能是实现目标的最简单方法。
答案 3 :(得分:0)
如果你想要小数位,你不能首先使用浮点数,因为FP没有它们:FP有二进制位。使用BigDecimal,
并直接从String.
构建它。我不明白为什么你需要一个DecimalFormat
对象。
答案 4 :(得分:0)
您可以使用正则表达式将数字字符串转换为格式字符串:
String format = num.replaceAll("^\\d*", "#").replaceAll("\\d", "0");
例如“123.45” - &gt; “#.00”和“123” - &gt; “#”
然后使用结果作为DecimalFormat
的模式它不仅有效,而且只有一条线。
答案 5 :(得分:-1)
我添加了一个代码来设置小数位数以保持与decimal1
public static void main(String[] args) {
try {
DecimalFormat df = new DecimalFormat();
String decimal1 = "54.60"; // Decimal is input as a string with a specific number of significant digits.
//
int index = decimal1.indexOf(".");
int prec = -1;
if (index != -1) {
prec = decimal1.substring(index, decimal1.length()).length();
}
if (prec>0) {
df.setMaximumFractionDigits(prec);
df.setMinimumFractionDigits(prec-1);
}
//
double d = df.parse(decimal1).doubleValue();
d = d * -1; // Multiply the decimal by -1 (this is why we parsed it, so we could do a calculatin).
System.out.println(df.format(d)); // I need to print this with the same # of significant digits.
} catch (ParseException e) {
e.printStackTrace();
}
}