• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

niepoprawne odróżnienie większości od mniejszości

VPS Starter Arubacloud
+1 głos
401 wizyt
pytanie zadane 4 stycznia 2022 w JavaScript przez Jacek Śmiel Użytkownik (510 p.)
edycja 4 stycznia 2022 przez Jacek Śmiel

Witajcie,

staram się sprawdzić, czy wartość zmiennej let wartoscWyplaty nie jest większa od wartosci zmiennej let minDoWyplaty.

let minDoWyplaty = 17;

Niestety pojawia się dziwna dla mnie zależność, ponieważ skrypt działa i pokazuje poprawnie do pewnej wartości zmiennej, jeśli let wartoscWyplaty = 1.90 wszystko jest okej, ale jesli let wartoscWyplaty >= 2.00 wszystko przestaje działać...

        if(minDoWyplaty >= wartoscWyplaty) {
            console.log("Zlecono wyplate o wartosci: " + wartoscWyplaty + ", minimum do wyplaty aktualnie to: " + minDoWyplaty);
        }

 

komentarz 4 stycznia 2022 przez tkz Nałogowiec (42,020 p.)
Co oznacza "wszystko przestaje działać..."? Jeżeli "minDoWyplaty" jest większy, bądź równy "wartoscWyplaty" to if się wykona. Jeżeli nie, to nie. Masz problem w zrozumieniu znaków?
komentarz 4 stycznia 2022 przez Jacek Śmiel Użytkownik (510 p.)
Chodzi mi o to, że let minDoWyplaty = 17,a jeśli let wartoscWyplaty przekroczy dopiero 1.99 zaczyna poprawnie działać. To jest ta dziwna dla mnie zależność, czy może chodzić o to, że minDoWyplaty jest int'em? Może powinienem to przekonwertować to do wartości decymalnej czyli do 17.00
komentarz 4 stycznia 2022 przez Wiciorny Ekspert (276,820 p.)
ale let- nie jest intem, jest zmienną typu wartości przypisanej do niej. Więc raz jest to int, a raz jest to float.
komentarz 4 stycznia 2022 przez ScriptyChris Mędrzec (190,190 p.)

Więc raz jest to int, a raz jest to float

W JavaScript nie ma rozróżnienia na int czy float - jest po prostu typ Number (oraz BigInt dla liczb większych niż wartość określona w stałej Number.MAX_SAFE_INTEGER).

3 odpowiedzi

0 głosów
odpowiedź 4 stycznia 2022 przez Wiciorny Ekspert (276,820 p.)
edycja 4 stycznia 2022 przez Wiciorny

Problem w tym, że jak napisałeś "zmienna" nie jest INTEM, tylko typem wartości do niej przypisanej.
Jeśli raz jest to typ int, to okej ale 1.99 jest typu float zatem to nie zadziała do końca poprawnie, bo wtedy jeśli mamy doczynienia z porównaniem  1.0 > 1  -> to jest to true jeśli wartości będą literałami 

console.log("1.0" > "1"); // "true"
console.log(1.0 > 1);     // "false"

program działa z tym, że jeśli zapiszesz 2.00 1.00 etc to w wyniku ... z racji typu ( zera zostaną odcięte )

let minDoWyplaty= 17;
let wartoscWyplaty=2.01; // jesli będzie 2.01 to wyświetli 2.01

if(minDoWyplaty >= wartoscWyplaty) {
    console.log("Zlecono wyplate o wartosci: " + wartoscWyplaty + ", minimum do wyplaty aktualnie to: " + minDoWyplaty);
}

// jeśli zapiszesz 2.00 -> wyświetli Ci 2 i tak dla kazdej wartosci

dopiero w sytuacji kiedy wartośc po kropce nie bedzie zerami (tylko 01... itd ) wyświetli ci je, dlatego że same zera zostaną pominiene i JS uzna że ma doczynienia z intem. 

komentarz 5 stycznia 2022 przez Jacek Śmiel Użytkownik (510 p.)
Czyli rozumiem, że musze w jakiś sposób powiedzieć JS'owi aby nie ucinał tych zer i porównywał na sztywno to co mu dam. Niestety nie do końca wiem jak mu to wytłumaczyć, czy mógłbym Cię poprosić o podpowiedź?
0 głosów
odpowiedź 5 stycznia 2022 przez VBService Ekspert (255,680 p.)
edycja 5 stycznia 2022 przez VBService

Spróbuj może zamienić wyrażenie w warunku "miejscami" tzn.

z

if(minDoWyplaty >= wartoscWyplaty) ...

na

if (wartoscWyplaty >= minDoWyplaty) ...

a do wypisywania liczb użyj toFixed()

let minDoWyplaty = 16.00;
let wartoscWyplaty = 2.00;
 
if (wartoscWyplaty >= minDoWyplaty)
    console.log("1. Zlecono wyplate o wartosci: " + wartoscWyplaty.toFixed(2) + ", minimum do wyplaty aktualnie to: " + minDoWyplaty.toFixed(2));
 
if (minDoWyplaty >= wartoscWyplaty)
    console.log("2. Zlecono wyplate o wartosci: " + wartoscWyplaty.toFixed(2) + ", minimum do wyplaty aktualnie to: " + minDoWyplaty.toFixed(2));

 

 

 

P.S.  wink

let a = [0.01 , 2.00 , 0.00 , 1.99 , 3.00 ];
let b = [0.00 , 16.00 , 0.01, 16.00 , 16.00 ];

console.info('');

for (let i=0; i<a.length; i++)
  if (a[i] > b[i])
    console.log('a=' + a[i] + ' jest większe od b=' + b[i]);
  else
    console.log('b=' + b[i] + ' jest większe od a=' + a[i]);

console.info('parseFloat vs. parseFloat');

for (let i=0; i<a.length; i++)
  if (parseFloat(a[i]) > parseFloat(b[i]))
    console.log('a=' + a[i] + ' jest większe od b=' + b[i]);
  else
    console.log('b=' + b[i] + ' jest większe od a=' + a[i]);

console.info('toFixed vs. parseFloat');

for (let i=0; i<a.length; i++)
  if (a[i].toFixed(2) > parseFloat(b[i]))
    console.log('a=' + a[i] + ' jest większe od b=' + b[i]);
  else
    console.log('b=' + b[i] + ' jest większe od a=' + a[i]);

console.info('parseFloat vs. toFixed');

for (let i=0; i<a.length; i++)
  if (parseFloat(a[i]) > b[i].toFixed(2))
    console.log('a=' + a[i] + ' jest większe od b=' + b[i]);
  else
    console.log('b=' + b[i] + ' jest większe od a=' + a[i]);

console.info('toFixed vs. toFixed');

for (let i=0; i<a.length; i++)
  if (a[i].toFixed(2) > b[i].toFixed(2))
    console.log('a=' + a[i] + ' jest większe od b=' + b[i]);
  else
    console.log('b=' + b[i] + ' jest większe od a=' + a[i]);

 

0 głosów
odpowiedź 5 stycznia 2022 przez Us Użytkownik (880 p.)
Trochę się głowie nad tym od parunastu minut i nadal nie widzę problemu. Wszystko działa, jak należy. Nie mam już więcej czasu na tą chwilę, ale let zarobekDoWyplaty i let minDoWyplaty, dodałem na twardo czyli np. 15 i 17, jak i z setnymi dla testu, w taki sposób to działa, więc może tam jest jakiś problem.

Podobne pytania

0 głosów
1 odpowiedź 12,966 wizyt
0 głosów
2 odpowiedzi 183 wizyt
pytanie zadane 29 lipca 2017 w HTML i CSS przez Tsevykuhi Początkujący (430 p.)
0 głosów
1 odpowiedź 118 wizyt

92,950 zapytań

141,907 odpowiedzi

321,131 komentarzy

62,284 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...