Java 强迫大小数使用科学记数法

Java 强迫大小数使用科学记数法,java,bigdecimal,Java,Bigdecimal,我有这个方法: public void Example(BigDecimal value, int scale){ BigDecimal x = new BigDecimal("0.00001"); System.out.println("result: " + (value.multiply(x)).setScale(scale, RoudingMode.HALF_UP).toString()); 例如,如果值=1,标度=2,则输出为“结果:0.00”。我以为是1.0

我有这个方法:

    public void Example(BigDecimal value, int scale){
    BigDecimal x = new BigDecimal("0.00001");
    System.out.println("result: " + (value.multiply(x)).setScale(scale, RoudingMode.HALF_UP).toString());
例如,如果值=1,标度=2,则输出为“结果:0.00”。我以为是1.00E-5。因此,我的疑问是:如果比例尺大于某个值(在我的示例中是2),我如何强制用科学记数法对大十进制进行格式化?

您可以使用带
的setMinimumFractionDigits(int scale)


您可以使用以下内容:

int maxScale = 2;

BigDecimal value = BigDecimal.ONE;
BigDecimal x = new BigDecimal("0.00001");
BigDecimal result = value.multiply(x);

if (result.scale() > maxScale) {
    System.out.format("result: %.2E\n", result); // You can change .2 to the value you need
} else {
    System.out.println("result: " + result.toPlainString());
}
BigDecimal x = new BigDecimal("0.00001");
DecimalFormat frmt = new DecimalFormat("0.00E00");
String formatted = frmt.format(x.doubleValue());
System.out.println("result: " + formatted);

请尝试使用DecimalFormat类。它有双精度和长数值方法的格式化方法,因此您应该执行以下操作:

int maxScale = 2;

BigDecimal value = BigDecimal.ONE;
BigDecimal x = new BigDecimal("0.00001");
BigDecimal result = value.multiply(x);

if (result.scale() > maxScale) {
    System.out.format("result: %.2E\n", result); // You can change .2 to the value you need
} else {
    System.out.println("result: " + result.toPlainString());
}
BigDecimal x = new BigDecimal("0.00001");
DecimalFormat frmt = new DecimalFormat("0.00E00");
String formatted = frmt.format(x.doubleValue());
System.out.println("result: " + formatted);

以下是DannyMo答案的一个版本,可以自动设置刻度:

private static String format(BigDecimal x)
{
    NumberFormat formatter = new DecimalFormat("0.0E0");
    formatter.setRoundingMode(RoundingMode.HALF_UP);
    formatter.setMinimumFractionDigits((x.scale() > 0) ? x.precision() : x.scale());
    return formatter.format(x);
}

System.out.println(format(new BigDecimal("0.01")));   // 1.0E-2
System.out.println(format(new BigDecimal("0.001")));  // 1.0E-3
System.out.println(format(new BigDecimal("500")));    // 5E2
System.out.println(format(new BigDecimal("500.05"))); // 5.00050E2

为什么不使用自己的
toString
toEngineeringString
方法呢?@PM77-1:两者都不总是使用科学符号。工程符号并不总是科学符号。@PM因为,对于我所做的,我需要的是科学符号,而不是工程符号……这可能不是很有帮助,但这里有一种方法可以打印
1.0E-5
x.doubleValue()
你可以用基本的数学来计算<代码>(num/pow(10,floor(log(num))+“E”+floor(log(num))。但是如果刻度值发生变化,该怎么办?如何处理?请参阅下面自动设置刻度的版本。注意:DecimalFormat只处理可以表示为双精度的数字。尝试格式化BigDecimal(“1e400”),它会给您∞".将一个大的小数点移动到两倍可能会弄乱数值。这不是一个解决方案。