Jak ominac zaokraglanie liczb zmienno przecinkowych przez JS?

Odpowiedz Nowy wątek
2019-06-04 12:04

Rejestracja: 11 lat temu

Ostatnio: 10 godzin temu

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
Moderator

Rejestracja: 12 lat temu

Ostatnio: 19 minut temu

Lokalizacja: Wrocław

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

Rejestracja: 11 lat temu

Ostatnio: 10 godzin temu

0

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

Pozostało 580 znaków

2019-06-04 12:10
Moderator

Rejestracja: 12 lat temu

Ostatnio: 19 minut temu

Lokalizacja: Wrocław

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

Rejestracja: 11 lat temu

Ostatnio: 10 godzin temu

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

Aqu
2019-06-04 12:21
Aqu

Rejestracja: 5 lat temu

Ostatnio: 1 miesiąc temu

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

Rejestracja: 11 lat temu

Ostatnio: 10 godzin temu

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
Moderator Kariera

Rejestracja: 2 lata temu

Ostatnio: 4 godziny temu

Lokalizacja: Poznań

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.


Naczelny forumowy hejter Apple

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

Rejestracja: 9 lat temu

Ostatnio: 4 godziny temu

Lokalizacja: Grudziądz/Bydgoszcz

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.


It's All About the Game.
edytowany 1x, ostatnio: mr_jaro, 2019-06-04 14:50

Pozostało 580 znaków

2019-06-04 14:59

Rejestracja: 11 lat temu

Ostatnio: 10 godzin temu

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

Rejestracja: 9 lat temu

Ostatnio: 4 godziny temu

Lokalizacja: Grudziądz/Bydgoszcz

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.


It's All About the Game.
edytowany 1x, ostatnio: mr_jaro, 2019-06-04 15:03

Pozostało 580 znaków

Odpowiedz

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