Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Phi 08. 01. 2019, 12:28:25

Název: Otázka pro javisty.
Přispěvatel: Phi 08. 01. 2019, 12:28:25
Dobrý den, teď koukám v legacy kódu na tohle :
Kód: [Vybrat]
String format(double value) {
...
If ( value == (long)value)...

Mám na to nějaký názor, ale zajímal by mne váš.
Název: Re:Otázka pro javisty.
Přispěvatel: Stringa 08. 01. 2019, 12:40:31
A ta slibovana otazka je kde? Co to ma jako byt?
Název: Re:Otázka pro javisty.
Přispěvatel: balki 08. 01. 2019, 13:02:09
moj nazor je, ze sa to ani neskompiluje :)
Název: Re:Otázka pro javisty.
Přispěvatel: Boiolean 08. 01. 2019, 14:13:07
je  to truei?
Název: Re:Otázka pro javisty.
Přispěvatel: anonym 08. 01. 2019, 14:25:30
Dobrý den, teď koukám v legacy kódu na tohle :
Kód: [Vybrat]
String format(double value) {
...
If ( value == (long)value)...

Mám na to nějaký názor, ale zajímal by mne váš.

Stane se to, ze to udela

double value = 1234.567d

if( 1234.567d == 1234.0d )

Tzn. tim ze se to prevede na long se odsekne vsechno za desetinnou carkou, ale kdyz se porovnavaji cisla a jedno z nich je double, java imlicitne prevede vsechno na double.

Takze se to jednoduse pta, jestli je to Value bez desetinnych mist.
Název: Re:Otázka pro javisty.
Přispěvatel: Phi 08. 01. 2019, 14:54:51
Nejdřív se explicitně castuje double na long a dojde k oříznutí desetiných čísel, pak se při porovnání implicitně castuje ta hodnota zpět do double a porovnají se. Jen přemýšlím, jestli tam není nějaký edge case. Respektive vím, že v předpokládané validnich hodnot není, ale obecně, když vezmu i subnormalní čísla, nebo naopak velmi velká?
Já bych psal úplně automaticky
Kód: [Vybrat]
If (Math.abs(value - Math.round(value)) < Double.MIN_VALUE)
protože mi to přijde čitelnější.
Název: Re:Otázka pro javisty.
Přispěvatel: pepa 08. 01. 2019, 15:46:50
Nejdřív se explicitně castuje double na long a dojde k oříznutí desetiných čísel, pak se při porovnání implicitně castuje ta hodnota zpět do double a porovnají se. Jen přemýšlím, jestli tam není nějaký edge case. Respektive vím, že v předpokládané validnich hodnot není, ale obecně, když vezmu i subnormalní čísla, nebo naopak velmi velká?
Já bych psal úplně automaticky
Kód: [Vybrat]
If (Math.abs(value - Math.round(value)) < Double.MIN_VALUE)
protože mi to přijde čitelnější.

+1

Ale v podstatě je to zajímavá vychytávka, pokud to funguje. Udělal bych test, jestli to alespoň funguje. Pokud jo, tak pokud tam nezáleží na výkonu, tak bych to přepsal.
Název: Re:Otázka pro javisty.
Přispěvatel: anonym 08. 01. 2019, 15:55:17
If (Math.abs(value - Math.round(value)) < Double.MIN_VALUE)
Nejdřív se explicitně castuje double na long a dojde k oříznutí desetiných čísel, pak se při porovnání implicitně castuje ta hodnota zpět do double a porovnají se. Jen přemýšlím, jestli tam není nějaký edge case. Respektive vím, že v předpokládané validnich hodnot není, ale obecně, když vezmu i subnormalní čísla, nebo naopak velmi velká?
Já bych psal úplně automaticky
Kód: [Vybrat]
If (Math.abs(value - Math.round(value)) < Double.MIN_VALUE)
protože mi to přijde čitelnější.

To mas nejake divne.

Kód: [Vybrat]

if( value - Math.floor(value) <= Double.MIN_NORMAL )
Název: Re:Otázka pro javisty.
Přispěvatel: gll 08. 01. 2019, 15:58:03
Nejdřív se explicitně castuje double na long a dojde k oříznutí desetiných čísel, pak se při porovnání implicitně castuje ta hodnota zpět do double a porovnají se. Jen přemýšlím, jestli tam není nějaký edge case. Respektive vím, že v předpokládané validnich hodnot není, ale obecně, když vezmu i subnormalní čísla, nebo naopak velmi velká?
Já bych psal úplně automaticky
Kód: [Vybrat]
If (Math.abs(value - Math.round(value)) < Double.MIN_VALUE)
protože mi to přijde čitelnější.

(long)value nedělá round, ale floor
Název: Re:Otázka pro javisty.
Přispěvatel: Phi 08. 01. 2019, 16:09:32
Nejdřív se explicitně castuje double na long a dojde k oříznutí desetiných čísel, pak se při porovnání implicitně castuje ta hodnota zpět do double a porovnají se. Jen přemýšlím, jestli tam není nějaký edge case. Respektive vím, že v předpokládané validnich hodnot není, ale obecně, když vezmu i subnormalní čísla, nebo naopak velmi velká?
Já bych psal úplně automaticky
Kód: [Vybrat]
If (Math.abs(value - Math.round(value)) < Double.MIN_VALUE)
protože mi to přijde čitelnější.

+1

Ale v podstatě je to zajímavá vychytávka, pokud to funguje. Udělal bych test, jestli to alespoň funguje. Pokud jo, tak pokud tam nezáleží na výkonu, tak bych to přepsal.

No, jsem nerozhodnej jestli je to vychytávka nebo prasárna. Jako hezký se o tom pobavit, ale když potřebuju rychle preskenovat metody třídy a v každé druhé je něco takového, tak to zrovna moc rychle nejde. A když do té třídy sahám, nechci tam nechávat věci, které mému nástupci budou ztěžovat život.
Název: Re:Otázka pro javisty.
Přispěvatel: dxx 08. 01. 2019, 16:11:34
Dobrý den, teď koukám v legacy kódu na tohle :
Kód: [Vybrat]
String format(double value) {
...
If ( value == (long)value)...

Mám na to nějaký názor, ale zajímal by mne váš.

Tak na tohle si neumim udelat nazor dokud nebudu vedet co bylo zadanim. Nicmene i tak muzu rict ze je to kravina...
Název: Re:Otázka pro javisty.
Přispěvatel: Phi 08. 01. 2019, 16:12:31
Nejdřív se explicitně castuje double na long a dojde k oříznutí desetiných čísel, pak se při porovnání implicitně castuje ta hodnota zpět do double a porovnají se. Jen přemýšlím, jestli tam není nějaký edge case. Respektive vím, že v předpokládané validnich hodnot není, ale obecně, když vezmu i subnormalní čísla, nebo naopak velmi velká?
Já bych psal úplně automaticky
Kód: [Vybrat]
If (Math.abs(value - Math.round(value)) < Double.MIN_VALUE)
protože mi to přijde čitelnější.

(long)value nedělá round, ale floor
To na věci nic nemění, IMHO, test je na to, jestli má číslo nějaké desetinná čísla.
Název: Re:Otázka pro javisty.
Přispěvatel: dxx 08. 01. 2019, 16:17:12
Nejdřív se explicitně castuje double na long a dojde k oříznutí desetiných čísel, pak se při porovnání implicitně castuje ta hodnota zpět do double a porovnají se. Jen přemýšlím, jestli tam není nějaký edge case. Respektive vím, že v předpokládané validnich hodnot není, ale obecně, když vezmu i subnormalní čísla, nebo naopak velmi velká?
Já bych psal úplně automaticky
Kód: [Vybrat]
If (Math.abs(value - Math.round(value)) < Double.MIN_VALUE)
protože mi to přijde čitelnější.

(long)value nedělá round, ale floor
To na věci nic nemění, IMHO, test je na to, jestli má číslo nějaké desetinná čísla.

Jestli je cilem metody format naformatovat do stringu hodnotu double tak at si autor nastuduje DecimalFormat nebo alespon String formatter...

Jeste porad mi neco unika a jsem uplne mimo? Uz je to ze na to psal metodu je IMHO blbost.
Název: Re:Otázka pro javisty.
Přispěvatel: zvol 08. 01. 2019, 16:36:22
(long)value nedělá round, ale floor
(long)value nedělá ani round, ani floor, ale zaokrouhluje k nule.
Název: Re:Otázka pro javisty.
Přispěvatel: Phi 08. 01. 2019, 17:17:07
Nejdřív se explicitně castuje double na long a dojde k oříznutí desetiných čísel, pak se při porovnání implicitně castuje ta hodnota zpět do double a porovnají se. Jen přemýšlím, jestli tam není nějaký edge case. Respektive vím, že v předpokládané validnich hodnot není, ale obecně, když vezmu i subnormalní čísla, nebo naopak velmi velká?
Já bych psal úplně automaticky
Kód: [Vybrat]
If (Math.abs(value - Math.round(value)) < Double.MIN_VALUE)
protože mi to přijde čitelnější.

(long)value nedělá round, ale floor
To na věci nic nemění, IMHO, test je na to, jestli má číslo nějaké desetinná čísla.

Jestli je cilem metody format naformatovat do stringu hodnotu double tak at si autor nastuduje DecimalFormat nebo alespon String formatter...

Jeste porad mi neco unika a jsem uplne mimo? Uz je to ze na to psal metodu je IMHO blbost.
Formatuje celé čísla do X.0 a čísla které nejsou celá do X.YZ. Nejsem úplně jistej, že je to řešitelné DecimalFormatem.
Nicméně mne fakt spíš zajímala ta podmínka.
Název: Re:Otázka pro javisty.
Přispěvatel: . 08. 01. 2019, 17:22:07
No, jsem nerozhodnej jestli je to vychytávka nebo prasárna. Jako hezký se o tom pobavit, ale když potřebuju rychle preskenovat metody třídy a v každé druhé je něco takového, tak to zrovna moc rychle nejde. A když do té třídy sahám, nechci tam nechávat věci, které mému nástupci budou ztěžovat život.
To je věc, na které by ses neměl zaseknout víckrát, než jednou za život. Pak je to čitelnější než cokoliv jiného.
Název: Re:Otázka pro javisty.
Přispěvatel: kvr kvr 08. 01. 2019, 17:48:45
Stačí porovnat Math.floor(value) == value . Nemá-li nic za desetinnou (binární) tečkou, tak zaokrouhlení vrátí zcela stejné číslo. Porovnání s MIN_VALUE nebo nějakou deltou má smysl u něčeho, co číslo mění (aritmetické, konverze atd.).

Původní kód s cast na long bude fungovat pouze v případě, že původní hodnota je v rozsahu long, tedy +-2^63. double má rozsah +-2^1024.
Název: Re:Otázka pro javisty.
Přispěvatel: Martin 08. 01. 2019, 18:28:15
...pokud tam nezáleží na výkonu, tak bych to přepsal.
Pokud zalezi na vykonu, tak to nebudu psat v jave.