cari

Rumah  >  Soal Jawab  >  teks badan

关于java double类型运算的困惑

请看下面的代码

double a = 0.001;
double b = 13.456;
System.out.println(a);
System.out.println(b);
System.out.println(a+b);
System.out.println(b-a);

运算的结果是

0.001
13.456
13.456999999999999
13.455;

表示对结果不太理解,难道ab相加的结果不应该是13.457么

高洛峰高洛峰2886 hari yang lalu343

membalas semua(2)saya akan balas

  • 迷茫

    迷茫2017-04-17 17:43:32

    Double akan kehilangan ketepatan semasa operasi. Adalah disyorkan untuk menggunakan java.math.BigDecimal untuk operasi.

    balas
    0
  • 高洛峰

    高洛峰2017-04-17 17:43:32

    Ini kerana nombor titik terapung dalam komputer mungkin (perhatikan bahawa ia mungkin) tidak tepat. Kenapa jadi begini? Ini ditentukan oleh peraturan penyimpanan nombor titik terapung Mari kita lihat dahulu cara menukar nombor perpuluhan 0.4 kepada perpuluhan binari, menggunakan kaedah "didarab dengan 2, dibundarkan dan disusun mengikut tertib" (tidak faham? Ini adalah perkara yang tidak perlu, ia terlalu asas ), kami mendapati bahawa 0.4 tidak boleh diwakili dengan tepat oleh perduaan Dalam dunia nombor perduaan, ia adalah perpuluhan berulang yang tidak terhingga, ia tidak boleh "dipaparkan" walaupun ia "dipaparkan". Apatah lagi ia disimpan dalam ingatan (penyimpanan nombor titik terapung termasuk tiga bahagian: bit tanda, bit eksponen dan mantissa, yang tidak akan diperkenalkan secara terperinci Ia boleh difahami bahawa tidak ada cara untuk mewakili dengan tepat). 1/3 dalam dunia perpuluhan, jadi dalam Sudah tentu, 1/5 tidak boleh dinyatakan dengan tepat dalam dunia binari (ia boleh dinyatakan jika binari juga mempunyai pecahan Dalam dunia binari, 1/5 ialah perpuluhan berulang yang tidak terhingga).

    balas
    0
  • Batalbalas