Jak ominac zaokraglanie liczb zmienno przecinkowych przez JS?

0

Witam,

Przypisuje wartosci zmiennych z PHP do JS. Wszystko w JSONie.


var orderJson = <tal:block content="structure php: json_encode(order)"/>;

Cena zamowienia to np 5.00, 10.49 albo 50.40 itd. Cena zamowienia zawsze jest typu float z dwoma miejscami po przecinku.

Zakazdym razem JS zaokragla 5.00 do 5, 50.40 do 50.4. Dlaczego tak sie dzieje? Jak to ominac?

Przypisane wartosci do orderJson wysylam od razu przez SDK i wszystkie ceny maja byc typu float z dwoma miejscami po przecinku. Nie moge wyslas stringa. JS musi jest madrzejsze i musi zrobic swoje.

Jakies pomysly?

3

Jeśli zależy Ci na zachowaniu formatowania liczb, przekazuj je jako ciągi znaków - nie ma innego sposobu.

Ew. możesz budować ten obiekt ręcznie, przy czym to zaczyna brzmieć na problem X/Y.

0

@Patryk27: Mozesz podac przyklad? Rozwin swoja mysl? Nie kumam.

0

JS nie zaokrągla 50.40 do 50.4, podobnie jak nie zaokrągla 50.4 do 50.400000000, ponieważ jedno jest dokładnie równe drugiemu (nie następuje tutaj żadna aproksymacja czy utrata precyzji) - stąd jeśli chcesz w wyniku otrzymać konkretnie akurat 50.40, musisz to sformatować do ciągu znaków (toFixed()).

0

Tak, prawda to sa dalej take same wartosci. Ale JS zmienia format. Jak napisalem wyzej nie moge wysylac stringa. Poniewaz te dane sa wykorzystywane w zewnetrznym systemie do obliczen. Wiec jak wysle string obliczen nie bedzie :/ Tak mi napisal support. Wiec teraz siedze i glowie sie nad problemem, ktorego nie ma.

1

Jesteś pewien, że problem jest w JSie? To php zamienia Ci obiekt na JSON:

echo json_encode(["x" => 5.50]);

zwraca:
{"x":5.5}.

0

@Aqu. Ale wpisz np w console var float = 5.50 i nastepnie wywolaj ta zmienna float to wyrzuci ci 5.5.

1

Nie wiem, czy dobrze się rozumiemy, ale rzuć okiem na ten link - https://jsfiddle.net/e3xLpwnh/.

Pobiera wartości liczbowe w dowolnej postaci (bez części ułamkowej, albo z dowolną ilością znaków po przecinku) i wyświetla w formacie XXXX,YY. Zawsze masz dwa miejsca po przecinku, nawet jeśli podasz liczbę całkowitą. Może to jest jakaś wskazówka. P.S. wiem, że brzydko napisane - robiłem na szybko, żeby pokazać sam mechanizm. Ty tego używasz do JSON'a, wcześniej ludzie pisali, że to PHP może robić zamiany, niemniej i tak możesz już sobie przerobić dane po otrzymaniu ich przez JS :)

EDIT
zauważyłem, że w przypadku X1 następuje zaokrąglenie, a nie obcięcie. Aczkolwiek z tego co piszesz, to nie powinno być problemem, bo z backendu dostajesz już dane posiadające dwa miejsca po przecinku, w związku z czym raczej nic nie powinno się zaokrąglać. Ale miej to na uwadze.

1

Jeśli chcesz wyświetlić z odpowiednią liczbą miejsc po przecinku użyj metody toFixed() np

let b = 4.5;
alert(b.toFixed(2));

Wyświetli ci się 4.50.

//edit. Pamiętaj, że ta metoda nie zaokrągla, tylko obcina zbyt wiele znaków z prawej lub dodaje 0 jeśli jest za mało.

2

To po co ci float z zerami, które nic nie zmieniają? Nie zrobisz tego, to jest niewykonalne gdyż 4.5 = 4.50 = 4.5000000000000000 to są przeciez liczby.

0

Jak pisalem wysylam dane przez SDK do zewnetrzenego serwera - CRMa. Tak jak byc wysylal dane przez API w backendzie. Chodzi o to ze cena zamowienia bedzie uzywana np do obliczen statystyk czyli wykonywane beda na niej mnozenie, dzielenie, dodawanie itd. Wiec nie moze to byc string. Druga sprawa, ze ta sama zmienna bedzie uzyta do wyslania email do klienta. A w emailu chce wyswietlic 10.50 a nie 10.5. Zapytalem ludzi z saportu czy oni moga to zaokraglic do dwoch miejsc po przeciku. I napisali, ze nie moga, ze to moj problem.

2

Popieram @mr_jaro - jeśli potrzebujesz tego jako string do wyświetlenia, to masz przynajmniej dwa sposoby (podany przeze mnie oraz Jaro), jeśli chcesz to przetwarzać jako wartość numeryczną to nie ma znaczenia, ile jest miejsc po przecinku. Może jak wyjaśnisz, co konkretnie kombinujesz i co chcesz osiągnąć, łatwiej będzie coś doradzić.

EDIT - widzę, że się minęliśmy z odpowiedziami i Twoja się pojawiła w chwili, w której pisałem swojego posta.
W takim razie chyba najsensowniej będzie Ci to trzymać jako float i w tej postaci przekazywać/odbierać do CRm, a podczas wyświetlania użytkownikowi skorzystaj z podanych przez nas sposobów formatowania.

0

@cerrato: I to jest wlasnie problem, bo ja nie mam zupelnie wplywu na to co sie dzieje po stronie CRMa. My placimy za niego i nie mamy dostepu. Chyba zrobie tak, ze bede wysylal dwie zmienne przez SDK.

order_price_float = 15.0;
order_price_string = "15.00";

Jedna bedzie uzyta do obliczen a druga do wyswietlania w xHTMLu. Ok, dzieki chlopaki. Doceniam i pozdrawiam.

1

wysyłasz floata, obliczasz floatem a dopiero przy generowaniu maila powinno być zrobione formatowanie. Czyli trzeba poprawić templatkę maila. Tyle. Tak się to robi, bo innego wyjścia nie ma a i to jedyne logiczne rozwiązanie.

0

@mr_jaro: Zgadzam sie w 100% z Toba. Ale nie mam dostepu do CRM. My tworzymy templatki, ale CRM nie ma zadnego swojego jezyka do szablownow. Jedyne co maja to:

[%if(order_price>0)%]
[%else%]
[%endif%]

i samo wyswietlanie atrybutow z API

[%order_price%] zlotych

Nic wiecej. Nie ma czegos takeigo jak |format(2) czy nawet petli. A kosztuje w pizdu.

1

i nie przejdzie coś takiego

[number_format(%order_price%, 2)] zlotych

Jakbyśmy wiedzieli jaki system templatek jest użyty to by się to ogarnęło,teraz strzelam.

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