Otázka pro javisty.

Phi

Otázka pro javisty.
« kdy: 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áš.


Stringa

Re:Otázka pro javisty.
« Odpověď #1 kdy: 08. 01. 2019, 12:40:31 »
A ta slibovana otazka je kde? Co to ma jako byt?

balki

Re:Otázka pro javisty.
« Odpověď #2 kdy: 08. 01. 2019, 13:02:09 »
moj nazor je, ze sa to ani neskompiluje :)

Boiolean

Re:Otázka pro javisty.
« Odpověď #3 kdy: 08. 01. 2019, 14:13:07 »
je  to truei?

anonym

Re:Otázka pro javisty.
« Odpověď #4 kdy: 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.


Phi

Re:Otázka pro javisty.
« Odpověď #5 kdy: 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ší.

pepa

Re:Otázka pro javisty.
« Odpověď #6 kdy: 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.

anonym

Re:Otázka pro javisty.
« Odpověď #7 kdy: 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 )

gll

  • ****
  • 429
    • Zobrazit profil
    • E-mail
Re:Otázka pro javisty.
« Odpověď #8 kdy: 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

Phi

Re:Otázka pro javisty.
« Odpověď #9 kdy: 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.

dxx

Re:Otázka pro javisty.
« Odpověď #10 kdy: 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...

Phi

Re:Otázka pro javisty.
« Odpověď #11 kdy: 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.

dxx

Re:Otázka pro javisty.
« Odpověď #12 kdy: 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.

zvol

Re:Otázka pro javisty.
« Odpověď #13 kdy: 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.

Phi

Re:Otázka pro javisty.
« Odpověď #14 kdy: 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.