Jak ominac zaokraglanie liczb zmienno przecinkowych przez JS?

Odpowiedz Nowy wątek
2019-06-04 12:04
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?

edytowany 1x, ostatnio: poniatowski, 2019-06-04 12:05

Pozostało 580 znaków

2019-06-04 12:06
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.


edytowany 4x, ostatnio: Patryk27, 2019-06-04 12:08
Czy ciag znakow rowna sie do stringa? - poniatowski 2019-06-04 12:10
Niestety nie rozumiem o co pytasz. - Patryk27 2019-06-04 12:10

Pozostało 580 znaków

2019-06-04 12:07
0

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

Pozostało 580 znaków

2019-06-04 12:10
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()).


edytowany 3x, ostatnio: Patryk27, 2019-06-04 12:11

Pozostało 580 znaków

2019-06-04 12:12
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.

Pozostało 580 znaków

2019-06-04 12:21
Aqu
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}.

Pozostało 580 znaków

2019-06-04 12:26
0

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

Tak, wiem, ale to nie ma znaczenia w jaki sposób przeglądarką wyświetla floaty. Zacznijmy od tego: var orderJson = <tal:block content="structure php: json_encode(order)"/>; Czy tutaj PHP zwraca Ci 5.50? Jeśli tak, to możesz trzymać tego JSONa jako tekst: var orderJson = '<tal:block content="structure php: json_encode(order)"/>'; i przesyłać takiego JSONa do SDK. Jeśli PHP zwraca Ci 5.5 to możesz masz dwa wyjścia, pokombinować coś z json_encode i zrobić jak wyżej, albo pokombinować przy parsowaniu po stronie JS. Bo rozumiem, że do SDK dane przesyłasz JSONem? - Aqu 2019-06-04 13:01
Tak, przesylam json. ok, sprawdze jeszcze json_encode. Moze i masz racje. - poniatowski 2019-06-04 13:09

Pozostało 580 znaków

2019-06-04 14:32
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.


That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say
edytowany 2x, ostatnio: cerrato, 2019-06-04 14:46

Pozostało 580 znaków

2019-06-04 14:47
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.

edytowany 1x, ostatnio: mr_jaro, 2019-06-04 14:50

Pozostało 580 znaków

2019-06-04 14:59
0

@mr_jaro: toFixed() zwraca string. A ja musze wyslac flaot. https://developer.mozilla.org[...]Global_Objects/Number/toFixed

Pozostało 580 znaków

2019-06-04 15:02
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.

edytowany 1x, ostatnio: mr_jaro, 2019-06-04 15:03

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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