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ę.
- Rejestracja:prawie 15 lat
- Ostatnio:ponad 3 lata

- Rejestracja:około 8 lat
- Ostatnio:3 minuty
- Postów:4896
Chyba, że czegos nie dostrzegam, ale toFixed
daje taki efekt.
https://www.w3schools.com/jsref/jsref_tofixed.asp

- Rejestracja:około 11 lat
- Ostatnio:10 minut
- Postów:1472
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.

- Rejestracja:około 11 lat
- Ostatnio:10 minut
- Postów:1472
lion137 napisał(a):
Rzeczywiście, ale w tym rozwiązaniu, jeszcze nie wszystko stracone, jakby dodać,
0.005
do123.91
, totoFixed(2)
zwróci co trzeba.
To jest jeszcze mniej czytelne niż z mnożeniem przez potęgę liczby 10, a potem dzieleniem przez nią^^
- Rejestracja:prawie 15 lat
- Ostatnio:ponad 3 lata
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 :(.
- Rejestracja:prawie 15 lat
- Ostatnio:ponad 3 lata
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.

- Rejestracja:około 6 lat
- Ostatnio:23 dni
- Postów:145
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 :-)
- Zaokrąglasz w dół do dwóch miejsc po przecinku (zamieniasz na text i odrzucasz wszystko po drugim znaku za kropką).
- 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.
- 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ż.