Súvisí s nasledujúcimi možnosťami pre C # a Java,
double d = 3 / 2 * 3.2;
Jáva
System.out.println(d); // 3.2
C #
Console.WriteLine(d); //3.2
Preskočí 3/2,
Vieme, že správna odpoveď by mala byť 4.8
ak zmením na
double d = 3.00 / 2 * 3.2;
Môžem získať 4,8,
Takže chcem sa opýtať, či (3/2 * 3.2) je nezákonné, prečo zatmenie a vs2008 nemajú chybu? A ako zabrániť tomuto problému v oboch C # a Java?
odpovede:
11 pre odpoveď č. 13 / 2
je považované za celočíselné rozdelenie, takže výsledok je 1
.
Potom vykonaním násobenia medzi 1
a 3.2
spôsobí celé číslo 1
byť povýšený na plávajúcu desatinnú čiarku 1
, čo má za následok 3.2
.
Myšlienka je:
// Both "3" and "2" are integers, so integer division is performed.
3 / 2 == 1
// "3.2" is a floating point value, while "1" is an integer, so "1" is
// promoted to an floating point value.
1 * 3.2 --> 1.0 * 3.2 == 3.2
Pri písaní 2.0
, desatinná čiarka hovorí Java, aby považovala literál za hodnotu s plávajúcou desatinnou čiarkou (v tomto prípade a double
), takže výsledok výpočtu je. \ t 4.8
podľa očakávania. Bez desatinnej čiarky je hodnota celočíselným literálom.
Nie je to chyba, ale problém s tým, ako sa s literálmi zaobchádza.
Viac informácií nájdete na nasledujúcich odkazoch:
25 pre odpoveď č. 2
3/2
je celočíselná divízia, ktorej výsledkom je 1
.
1 * 3.2
rovná 3.2
, čo je výsledok, ktorý dostanete.
Je to správne definovaný vzorec s dobre definovanými očakávanými výsledkami, a preto kompilátor nevykazuje žiadnu chybu. použitie 3.00
je to najlepší priamy spôsob, ako prinútiť kompilátor, aby používal matematiku s pohyblivou rádovou čiarkou.
z Thorbjørnodpoveď: ďalšou možnosťou je štandardizovať všetky vaše výpočty s pohyblivou rádovou čiarkou počnúc 1.0*
vo vašom príklade by to bolo 1.0*3/2*3.2
.
7 pre odpoveď č. 3
Je to úplne legálne, ale 3/2 je celé číslodivízia (čo je ako robiť divíziu, ale potom zvoliť číslo najbližšie k 0 (v niektorých jazykoch - nekonečno)). Musíte dať kompilátor nejaký "náznak" chcete rozdelenie, ktoré chcete robiť.
Môžete sa mu jednoducho vyhnúť písomne
3.0 / 2 * 3.2 or 3 / 2.0 * 3.2
3.0 / 2.0 * 3.2
3d / 2d * 3.2 (C#)
(double)3 / 2 * 3.2
6 pre odpoveď č. 4
Ak chcete byť URČIT, že výpočet sa stane s desatinnými miestami namiesto celých čísel, potom buď začať
1.0 * 3 / 2 * 3.2
alebo povedzte kompilátoru, že prvé číslo je reálne / dvojité:
3d / 2 * 3.2
3 pre odpoveď č. 5
Pri rozdelení jedného celočíselného literálu do druhého sa celý výraz spracuje pri celočíselnom delení: 3/2
ako taký sa stáva 1; nie 1,5 (pretože to sú všetky celé čísla). 1 * 3.2
je celé číslo povýšené na dvojnásobok; a ako taký, až do tohto bodu sa skutočne stane 1.0
.
EDIT: Neexistuje žiadna chyba, pretože nie je ilegálna.
1 pre odpoveď č. 6
3 / 2
je prvá vykonaná operácia.
oba 3
a 2
sú celé čísla. Keď sú dvaja int
sú rozdelené, odpoveď je int
(v tomto prípade je odpoveď 1
).
Takže od 3 / 2 * 3.2
skončíte s 1 * 3.2
, Keď násobíte int
a a float
, výsledok bude povýšený na a float
, Takže odpoveď je 3.2
.
1 pre odpoveď č. 7
Je to kvôli problémom s odlievaním a typom čísel.
V jazyku C # (a Java, ako sa zdá) 3 a 2 sú obidve celočíselné hodnoty, takže delenie „3/2“ je celočíselným delením, ktoré vedie k celému číslu 1.
Pretože 3.2 je hodnota s plávajúcou desatinnou čiarkou, celočíselný výsledok divízie sa prevedie na hodnotu s plávajúcou desatinnou čiarkou a potom sa násobí a pretože 1 * 3.2 je 3.2, výsledok "sd výsledok".
V tomto prípade nie je žiadna chyba kódu, preto to Java a C # akceptujú.
Najbezpečnejším spôsobom by vždy bolo povedať kompilátorovi, že tu potrebujete hodnoty s plávajúcou desatinnou čiarkou
3,0 / 2,0 * 3,2
Funguje to vo všetkých prípadoch.
0 pre odpoveď č. 8
V C #
3d / 2d * 3.2
Ako už bolo uvedené