Sprawdzanie wartości po przecinku

Odpowiedz Nowy wątek
2014-10-24 14:58
0

Chciałbym sprawdzic czy w liczbie typu double po przecinku znajduje się cyfra 5. I jak to zrobić? Probowałem tak:

(s*10)%10==5

Lecz to nie pyka bo kompilator zwraca:

error: invalid operands of types ‘double’ and ‘double’ to binary ‘operator%’|

Jakieś pomysły? :D

Pozostało 580 znaków

2014-10-24 15:03
kq

% nie działa dla liczb zmiennoprzecinkowych, ale masz fmod, przy czym nie wiem czy jest sens go używać.
Możesz zamienić Twoją liczbę na string i sprawdzić pierwszą cyfrę po , lub . (zależnie od locale)

Ale najprościej by było po prostu castować wynik mnożenia na int:

static_cast<int>(s*10)%10 == 5

Zamiast na int możesz chcieć castować na coś większego (np. long, albo long long lub nawet jakiś bigint z jakiejś biblioteki), jeśli przewidujesz, że s*10 może się nie zmieścić w zakresie wartości inta.


edytowany 1x, ostatnio: kq, 2014-10-24 15:44
no kurde no ;p - twonek 2014-10-24 15:04
Jeszcze trochę i będziemy mieli takie wyścigi jak na SO ;) - kq 2014-10-24 15:06
A potem są komentarze, że reszta na forum nie pomaga tylko sępi :P - EroSanin 2014-10-24 15:21

Pozostało 580 znaków

2014-10-24 15:03
2
static_cast<int>(s*10) % 10 == 5;

Pozostało 580 znaków

2014-10-24 15:04
2

mozesz rozwiazac na kilka sposobow

zamien to do stringa, znajdz pierwsza liczbe po przecinku i sprawdz jaka to jest
pomnoz liczbe przez 10 zrzutuj na inta (po przecinku wszystko zostanie wyrzucone) a nastepnie sprawdz jaka jest ostatnia liczba (przez modulo)

Pozostało 580 znaków

2014-10-24 15:06
0

Coś myślałem nad stringiem ale stwierdziłem że pewnie istnieje jakiś szybszy sposób ;) Dzięki za szybką odpowiedź :D

Pozostało 580 znaków

2014-10-24 15:40
1

Jedyną wersja poprawnie działająca dla każdej wartości to skonwertowanie na napis i szukanie w tym napisie ciągu ".5" pozostałe metody mogą nie zadziałać np dla double x=1.5E300;
Ewentualnie użyć fmod: http://ideone.com/AXKEyX


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon, 2014-10-24 18:45

Pozostało 580 znaków

2014-10-24 18:34
0

Albo:

double liczba = 11.5123;
int calk = static_cast<int>(liczba);
double po_przecinku = liczba - (double)calk;

http://ideone.com/fb5WTs
I wtedy sprawdzasz tą zmienną po_przecinku.


Asm/C/C++
Jakoś nie działa ten twój kod: http://ideone.com/iN5MTc - _13th_Dragon 2014-10-24 18:41
Wiadomo, że dla takich ekstremalnie dużych liczb int albo nawet long long int będzie za mały aby pomieścić tą wartość przed przecinkiem, więc się nie uda. Ale gdzie ty używasz tak ekstremalnie dużych liczb, które i tak do double zostaną zapisane niedokładnie, i wartość po przecinku nie będzie jako tako miała prawa bytu. - mwl4 2014-10-24 18:49
Z fmod zadziała w każdym przypadku więc po kiego licha kombinować z bezsensownymi rzutowaniami. - _13th_Dragon 2014-10-24 19:05

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