/ / C # a Java: 3/2 * 3,2 = 3,2, prečo? [duplikát] - c #, java

C # a Java: 3/2 * 3.2 = 3.2, prečo? [duplicitné] - c #, java

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ď č. 1

3 / 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.00je 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 intsú 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é