Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: Phi 08. 01. 2019, 12:28:25
-
Dobrý den, teď koukám v legacy kódu na tohle :
String format(double value) {
...
If ( value == (long)value)...
Mám na to nějaký názor, ale zajímal by mne váš.
-
A ta slibovana otazka je kde? Co to ma jako byt?
-
moj nazor je, ze sa to ani neskompiluje :)
-
je to truei?
-
Dobrý den, teď koukám v legacy kódu na tohle :
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.
-
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
If (Math.abs(value - Math.round(value)) < Double.MIN_VALUE)
protože mi to přijde čitelnější.
-
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
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.
-
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
If (Math.abs(value - Math.round(value)) < Double.MIN_VALUE)
protože mi to přijde čitelnější.
To mas nejake divne.
if( value - Math.floor(value) <= Double.MIN_NORMAL )
-
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
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
-
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
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.
-
Dobrý den, teď koukám v legacy kódu na tohle :
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...
-
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
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.
-
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
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.
-
(long)value nedělá round, ale floor
(long)value nedělá ani round, ani floor, ale zaokrouhluje k nule.
-
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
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.
-
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.
-
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.
-
...pokud tam nezáleží na výkonu, tak bych to přepsal.
Pokud zalezi na vykonu, tak to nebudu psat v jave.