[java] Java를 사용하여 과학적 표기법없이 이중 값을 인쇄하려면 어떻게합니까?

지수 형태없이 Java에서 이중 값을 인쇄하고 싶습니다.

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

이 E 표기법을 보여줍니다 1.2345678E7.

다음과 같이 인쇄하고 싶습니다. 12345678

이것을 방지하는 가장 좋은 방법은 무엇입니까?



답변

printf()함께 사용할 수 있습니다 %f:

double dexp = 12345678;
System.out.printf("dexp: %f\n", dexp);

인쇄 dexp: 12345678.000000됩니다. 소수 부분을 원하지 않으면

System.out.printf("dexp: %.0f\n", dexp);

이것은 문서에 설명 된 형식 지정자 언어를 사용합니다 .

toString()원래 코드에서 사용되는 기본 형식은 여기에 나와 있습니다 .


답변

Java는 이중으로 E 표기를 방지합니다.

double을 일반 숫자로 변환하는 다섯 가지 방법 :

import java.math.BigDecimal;
import java.text.DecimalFormat;

public class Runner {
    public static void main(String[] args) {
        double myvalue = 0.00000021d;

        //Option 1 Print bare double.
        System.out.println(myvalue);

        //Option2, use decimalFormat.
        DecimalFormat df = new DecimalFormat("#");
        df.setMaximumFractionDigits(8);
        System.out.println(df.format(myvalue));

        //Option 3, use printf.
        System.out.printf("%.9f", myvalue);
        System.out.println();

        //Option 4, convert toBigDecimal and ask for toPlainString().
        System.out.print(new BigDecimal(myvalue).toPlainString());
        System.out.println();

        //Option 5, String.format 
        System.out.println(String.format("%.12f", myvalue));
    }
}

이 프로그램은 다음을 인쇄합니다.

2.1E-7
.00000021
0.000000210
0.000000210000000000000001085015324114868562332958390470594167709350585
0.000000210000

모두 같은 값입니다.

Protip : 당신은 그 임의의 숫자가 두 배 값에 특정 임계 값을 초과 표시 이유에 대해 혼동하는 경우,이 비디오는 설명 : computerphile 이유는 무엇입니까 0.1+ 0.2같음 0.30000000000001?

http://youtube.com/watch?v=PZRI1IfStY0


답변

한마디로 :

후행 0과 로케일 문제를 제거하려면 다음을 사용해야합니다.

double myValue = 0.00000021d;

DecimalFormat df = new DecimalFormat("0", DecimalFormatSymbols.getInstance(Locale.ENGLISH));
df.setMaximumFractionDigits(340); // 340 = DecimalFormat.DOUBLE_FRACTION_DIGITS

System.out.println(df.format(myValue)); // Output: 0.00000021

설명:

다른 답변이 저에게 적합하지 않은 이유 :

  • Double.toString()또는 System.out.println또는 FloatingDecimal.toJavaFormatString이중 10 개 미만인 경우 ^ -3 과학적 표기법을 사용하거나보다 큰 10 ^ 7 동등
  • 을 사용 %f하면 기본 10 진수 정밀도는 6이며, 그렇지 않으면 하드 코딩 할 수 있지만 소수가 적 으면 추가 0이 추가됩니다. 예:

    double myValue = 0.00000021d;
    String.format("%.12f", myvalue); // Output: 0.000000210000
  • 사용하여 setMaximumFractionDigits(0);%.0f10 진수 정밀도 하거나 제거하면 정수 / 길이에는 적합하지만 double에는 적합하지 않습니다.

    double myValue = 0.00000021d;
    System.out.println(String.format("%.0f", myvalue)); // Output: 0
    DecimalFormat df = new DecimalFormat("0");
    System.out.println(df.format(myValue)); // Output: 0
  • DecimalFormat을 사용하면 로컬에 따라 다릅니다. 프랑스어 로케일에서 소수점 구분 기호는 점이 아닌 쉼표입니다.

    double myValue = 0.00000021d;
    DecimalFormat df = new DecimalFormat("0");
    df.setMaximumFractionDigits(340);
    System.out.println(df.format(myvalue)); // Output: 0,00000021

    ENGLISH 로케일을 사용하면 프로그램이 실행될 때마다 소수점 구분 기호를 얻을 수 있습니다.

왜 340을 사용 setMaximumFractionDigits합니까?

두 가지 이유 :

  • setMaximumFractionDigits 정수를 허용하지만 구현에는 최대 자릿수가 허용됩니다. DecimalFormat.DOUBLE_FRACTION_DIGITS 340입니다.
  • Double.MIN_VALUE = 4.9E-324 따라서 340 자리 숫자를 사용하면 더블을 반올림하지 않고 정밀도를 잃을 수 있습니다.

답변

당신은 그것을 시도 할 수 있습니다 DecimalFormat. 이 클래스를 사용하면 숫자를 파싱하는 데 매우 유연합니다.
사용하려는 패턴을 정확하게 설정할 수 있습니다.
예를 들어 귀하의 경우 :

double test = 12345678;
DecimalFormat df = new DecimalFormat("#");
df.setMaximumFractionDigits(0);
System.out.println(df.format(test)); //12345678


답변

BigDecimal의 toPlainString ()과 관련된 다른 솔루션이 있지만 이번에는 javadoc에서 권장되는 String 생성자를 사용합니다.

이 생성자는 Float.toString 및 Double.toString에서 반환 된 값과 호환됩니다. 이는 일반적으로 float 또는 double을 BigDecimal로 변환하는 데 선호되는 방법입니다. BigDecimal (double) 생성자의 예측 불가능 성을 겪지 않기 때문입니다.

가장 짧은 형태로 다음과 같이 보입니다.

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

Pre Java 8에서는 값이 0 인 Double에 대해 “0.0”이 발생하므로 다음을 추가해야합니다.

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

NaN 및 무한 값은 추가로 확인해야합니다.

이러한 모든 고려 사항의 최종 결과 :

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

    // Pre Java 8, a value of 0 would yield "0.0" below
    if (d.doubleValue() == 0)
        return "0";
    return new BigDecimal(d.toString()).stripTrailingZeros().toPlainString();
}

Float에서 잘 작동하도록 복사 / 붙여 넣기 할 수도 있습니다.


답변

숫자가 정수인 한 작동합니다.

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

소수점 이하에 double 변수의 정밀도가 있으면 잘립니다.


답변

나는 이중 값을 통화 값으로 변환해야했고 대부분의 솔루션은 괜찮지 만 나에게는 그렇지 않다는 것을 알았습니다.

DecimalFormat그래서 여기에 내가 무슨 짓을했는지이다, 결국 나를 위해 방법이었다 :

   public String foo(double value) //Got here 6.743240136E7 or something..
    {
        DecimalFormat formatter;

        if(value - (int)value > 0.0)
            formatter = new DecimalFormat("0.00"); // Here you can also deal with rounding if you wish..
        else
            formatter = new DecimalFormat("0");

        return formatter.format(value);
    }

보시다시피, 숫자가 자연 스럽다면 소수점없이 2E7 (예 : 2020) 대신 20000000을 얻습니다.

그리고 십진수이면 두 자리 숫자 만 얻습니다.