Java-kaksoisarvoalue ja kaksinkertainen MAX_VALUE ja MIN_VALUE

Java Double Value Range



Projekti tarvitsee erityisen tunnisteen, joka osoittaa, että käyttäjä ei ole syöttänyt arvoa. Arvotyyppi on kaksinkertainen. Yleinen järjestelmä on seuraava:
Ratkaisu A: Käytä kaksinkertaisen arvon suurinta tai pienintä arvoa
Vaihtoehto B: positiivinen ääretön, negatiivinen ääretön, NaN (koska arvo on tallennettava tietokantaan, se hylättiin)
Ratkaisu C: Käytä pakkausluokkaa Double sen sijaan, null tarkoittaa, että käyttäjä ei ole syöttänyt (JdbcTemplate-sovelluksen avulla, kun tietokannasta haettu arvo on tyhjä, getDouble palauttaa nollan sijaan 0).

Siksi päätin aluksi käyttää suunnitelmaa A. Menneeni syvemmälle löysin suuremman ongelman. Java Double -luokassa määritetyt enimmäis- ja vähimmäisarvot ylittävät selvästi alueen, jota voidaan edustaa 64 bitillä. Jotkut Double: n JDK: ssa määrittelemät vakioarvot ovat seuraavat:



public static final double MAX_VALUE = 0x1.fffffffffffffP+1023 // 1.7976931348623157e+308 public static final double MIN_NORMAL = 0x1.0p-1022 // 2.2250738585072014E-308 public static final double MIN_VALUE = 0x0.0000000000001P-1022 // 4.9e-324 public static final double POSITIVE_INFINITY = 1.0 / 0.0 public static final double NEGATIVE_INFINITY = -1.0 / 0.0 public static final double NaN = 0.0d / 0.0

Pitkän ajan kuluttua, sen jälkeen http://www.apihome.cn/api/java/Double.html Löysi vastauksen.



IEEE 754 -liukuluvun 'kaksinkertaisen tarkkuuden formaatin' bittiasettelun mukaan määritetyn liukulukuarvon esitys palautetaan ja NaN-arvo säilytetään. Bitti 63 (naamio
0x8000000000000000L Valittu bitti) edustaa liukuluvun merkkiä. Bitti 62-52 (maski 0x7ff0000000000000L
Valittu bitti) edustaa eksponenttia. Bitti 51-0 (peitteen 0x000fffffffffffffffL valitsema bitti) edustaa liukuluvun merkittävää numeroa (joskus kutsutaan mantissaksi).



Java-tuplan edustusalue ei ole -2 ^ 63 - (2 ^ 63) -1, ja sama pätee kellukkeeseen. Ottaen esimerkiksi kaksoisarvon, ylin bitti on merkkibitti, 62-52-bitti on eksponenttibitti ja 51-0-bitti on mantissa eli merkittävä luku.

kuva
Huomaa: Kuva on lainattu Wikipediasta

Voidaan nähdä, että kaksinkertainen (vastaavasti myös float on) tietokoneessa eroaa int, pitkä jne., Joten se voi edustaa niin suurta lukualueita. Muuten, Double-arvon vähimmäisarvo on nollasta poikkeava ei-negatiivinen minimiarvo. Pienin arvo on vain -MAX_VALUE ja negatiivinen suurin arvo -MIN_VALUE.



Palataksemme millaiseen ratkaisuun ongelman ratkaisemiseksi, suurin ja pienin arvo näyttävät olevan OK, mutta niin suuren tiedon tallentaminen tietokantaan on myös erittäin monimutkainen ongelma, joten keskustelimme erityisarvon valitsemisesta ( -123456789) edustamaan Käyttäjä ei kirjoittanut.

Itse asiassa kaavio C on hyvä järjestelmä, toisin sanoen sitä edustaa Double, mutta joitain muutoksia on tehtävä. Jos getDouble-menetelmällä saatu arvo on 0, niin tietokannan arvon tarkistamiseksi on käytettävä getString-menetelmää. Jos se on nolla, Double on nolla, jos se ei ole nolla, se tarkoittaa, että käyttäjä todella asettaa 0.

Opi oppimisen ja jakamisen asenteesta ostamalla yksi, saat yhden ilmaisen ja sitten tulet tietopisteeseen.
kuva
Huomaa: Kuvan sisältö on peräisin Java-ohjelmoinnin ajattelusta