Zaokrąglanie do dwóch miejsc po przecinku zawsze w górę

0

Cześć,
Pewnie pytanie dla wielu z Was wyda się banalne ale ja przyznam się bez bicia, poległem. Muszę zaokrąglić liczbę do 2 miejsc po przecinku z tym że zaokrąglenie zawsze musi być w górę. Dla przykładu, mam sobie wartość zmienno przecinkową: 123.914. Wywołując na niej metodę toFixed(2) otrzymam zaokrąglenie do wartości 123.91. Z matematycznego punktu widzenia jest to jak najbardziej prawidłowe i nie ma co się czepiać. Natomiast w moim przypadku nie mogę tego tak zrobić. Oczekiwanie jest aby zaokrąglenie było do wartości 123,92 a nie 91. I teraz zastanawiam się, czy jest jakaś gotowa metoda która w ten sposób to zrobi czy muszę rzeźbić coś swojego. Pomóżcie proszę.

3
Math.ceil(123.914 * 100) / 100;
0

Chyba, że czegos nie dostrzegam, ale toFixed daje taki efekt.
https://www.w3schools.com/jsref/jsref_tofixed.asp

0
lion137 napisał(a):

Chyba, że czegos nie dostrzegam, ale toFixed daje taki efekt.
https://www.w3schools.com/jsref/jsref_tofixed.asp

Nie. Nie daje. Zaokrąglenie da 123.91, zamiast 123.92.

2

Rzeczywiście, ale w tym rozwiązaniu, jeszcze nie wszystko stracone, jakby dodać, 0.005 do 123.91, to toFixed(2) zwróci co trzeba.

0
lion137 napisał(a):

Rzeczywiście, ale w tym rozwiązaniu, jeszcze nie wszystko stracone, jakby dodać, 0.005 do 123.91, to toFixed(2) zwróci co trzeba.

To jest jeszcze mniej czytelne niż z mnożeniem przez potęgę liczby 10, a potem dzieleniem przez nią^^

1

To jest jeszcze mniej czytelne

Pytanie - czy działa zgodnie z oczekiwaniami :P

0

Dzięki @serek. Dokładnie o coś takiego chodziło.

0

Cześć Panowie. Jednak nie do końca mi coś działa. Owszem, przykład z pierwszego mojego posta jest ok i działa ale dziś trafiłem na przypadek gdzie to nie zadziałało. Wartość 4129.64. Proste działanie i proste dzielenie na 2 ponieważ powinno zwrócić równo: 2064,84. Ale niestety:

Math.ceil((4129.64 / 2) * 100) / 100

zwraca mi 2064.83 :(.

0

Czyli jaki algorytm masz zrealizować?
Sprecyzuj algorytm, a potem go zapisz.
Twój algorytm jest taki -

  1. Odrzucam wszystko od trzeciego miejsca po przecinku
  2. Dodaję 0.01, chyba że? (że to co odrzuciłem było zerem).

Tak ma to działać?

0

Algorytm jest prosty. Mam pewną liczę którą muszę podzielić na 2 i zaokrąglić do dwóch miejsc po przecinku z tym warunkiem że zawsze ma zaokrąglać w górę. Czyli jeżeli mam np liczbę: 247.828 która po podzieleniu na 2 da nam 123,914 to ma mi zaokrąglić do liczby 123.92 a nie 123.91. I generalnie ta funkcja Math.ceil((247.828 / 2) * 100) / 100 działa. Ale dziś właśnie natrafiłem na przypadek gdzie dzielenie było proste ponieważ wychodziły równiutkie dwie części (4129.64) a ja dostałem zamiast 2064,82, wartość 2064,83 i tu jest błąd ponieważ jeżeli liczbę da się podzielić równo na dwie części to nie ma tu czego zaokrąglać w górę bo i po co. Zaokrąglanie powinno zadziałać tylko jeżeli po dzieleniu wychodzi jakaś wartość z większą ilością miejsc po przecinku albo jeżeli dzielę jakąś liczbę z większą ilością miejsc po przecinku. Tu akurat było prosto ponieważ dzieliłem na 2 liczbę z dwoma miejscami po przecinku która dzieliła się ładnie na dwie równe części.

1

Się nie zrozumieliśmy :-). Ja Ci sugeruję, żebyś sobie ten algorytm sprecyzował (może np. na kartce). Starał się wyłuskać z niego sedno problemu. I jak już to będziesz miał - to go zapisał w znanym Ci języku.
Wszelkie kombinacje z mnożeniem i dzieleniem, dodawaniem czegokolwiek, jeśli naprawdę zależy Ci na pewności działania - to tu raczej odpadają, bo operacje nie są wykonywane na liczbach rzeczywistych, tylko na ich binarnych reprezentacjach.
Dlatego zaproponowałem Ci wyżej rozwiązanie :-)

  1. Zaokrąglasz w dół do dwóch miejsc po przecinku (zamieniasz na text i odrzucasz wszystko po drugim znaku za kropką).
  2. To co Ci wyszło odejmujesz od liczby wyjściowej. To będzie reszta. Jeśli ta reszta jest zerem, to wynik z punku 1 jest wynikiem właściwym.
  3. Jeśli nie - to do wyniku z pkt 1 dodajesz 0.01 i to jest Twój wynik.

Czy tak ma to działać? Jeśli tak - to tylko zapisz to w kodzie i już.

1 użytkowników online, w tym zalogowanych: 0, gości: 1