我想在Java中打印一个没有指数形式的双值。

double dexp = 12345678;
System.out.println("dexp: "+dexp);

它显示了这个E符号:1.2345678E7。

我希望它像这样打印:12345678

预防这种情况的最好方法是什么?


当前回答

下面的代码检测所提供的数字是否以科学计数法表示。如果是这样,则在正常表示中使用最多“25”位数表示。

 static String convertFromScientificNotation(double number) {
    // Check if in scientific notation
    if (String.valueOf(number).toLowerCase().contains("e")) {
        System.out.println("The scientific notation number'"
                + number
                + "' detected, it will be converted to normal representation with 25 maximum fraction digits.");
        NumberFormat formatter = new DecimalFormat();
        formatter.setMaximumFractionDigits(25);
        return formatter.format(number);
    } else
        return String.valueOf(number);
}

其他回答

我得到了另一个涉及BigDecimal的toPlainString()的解决方案,但这次使用了string构造函数,这在javadoc中是推荐的:

此构造函数与Float返回的值兼容。toString和Double.toString。这通常是将浮点数或双精度浮点数转换为BigDecimal的首选方法,因为它不会受到BigDecimal(double)构造函数的不可预测性的影响。

它的最短形式是这样的:

return new BigDecimal(myDouble.toString()).stripTrailingZeros().toPlainString();

NaN和无限值必须额外检查,所以它的完整形式如下:

public static String doubleToString(Double d) {
    if (d == null)
        return null;
    if (d.isNaN() || d.isInfinite())
        return d.toString();

    return new BigDecimal(d.toString()).stripTrailingZeros().toPlainString();
}

这也可以复制/粘贴,以很好地与Float一起工作。

对于Java 7及以下版本,对于任何零值double,这将导致“0.0”,因此您需要添加:

if (d.doubleValue() == 0)
    return "0";

我的解决方案: 字符串str =字符串。格式(“%。0 f”,yourDouble);

只要你的号码是整数,这个方法就有效:

double dnexp = 12345678;
System.out.println("dexp: " + (long)dexp);

如果双精度变量在小数点后有精度,它将截断它。

使用字符串。格式(“%。0 f”,数量)

%。0f表示0小数

String numSring = String.format ("%.0f", firstNumber);
System.out.println(numString);

Java/Kotlin编译器将任何大于9999999(大于或等于1000万)的值转换为科学计数法。Epsilion符号。

示例:12345678被转换为1.2345678E7

使用此代码避免自动转换为科学计数法:

fun setTotalSalesValue(String total) {
        var valueWithoutEpsilon = total.toBigDecimal()
        /* Set the converted value to your android text view using setText() function */
        salesTextView.setText( valueWithoutEpsilon.toPlainString() )
    }