Wyciąganie części ułamowej z double

0

Witam,
jak można wyciągnąć wartość ułamkową ze zmiennej typu double?
Przykładowo mając liczby:
a = 2.123
b = 456.134646845
c = 0.1
mieć odpowiednio
a = 123
b = 134646845
c = 1

0

To nie takie proste, bo double ma duuużo miejsc po przecinku. To ze ci się wyświetla 2.123 to dlatego że taki masz zakres wypisywania, ale tak na prawdę tam jest 2.12300000000000....
Samo pozbycie się części całkowitej załatwi:

x-(int)x;

Ale teraz przerobienie tego na inta to już pewien problem. Tym bardziej biorąc pod uwagę fakt że int też moze mieć ograniczoną ilość cyfr.

0

A mi przyszło do głowy żeby zamienić to na string, usunąć wszystko przed kropką i zamienić na inta. Tak, wiem, że głupie.

0

http://stackoverflow.com/questions/499939/extract-decimal-part-from-a-floating-point-number-in-c/684464#684464

Działa to tak, że podaje część ułamkową w np tysięcznych, jeżeli N_DECIMAL_POINTS_PRECISION = 1000.

Czyli 1.005 da 5, a 1.5 da 500. (500 * 1/1000 = 0.5).

0

Może binarnie to rozgryźć...

liczba double jest postaci: x = 2^n * (1+m);

m = 0 do 0.5, ale to są 52 bity, czyli liczba całkowita 52 bitowa.

Zatem jeśli n > 0 wówczas część ułamkowa to n pierwszych bitów z m.

np. 2.5 = 2.1b = 2^1 * (1 + 0.25)
n = 1; m = 0.25 = 010000000000000000000000...;
przesuwamy o 1 i będzie:
m' = 10000000000000000000000... = 0.5

co zapisujemy w double: 2^-1 * (1 + 0);

x = 15 = 2^3 * (1 + 7/8)
n = 3; m = 7/8 = 1110000...
przesuwamy o 3 i jest:
m' = 0;

dla n > 51 nie potrzeba przesuwać - liczba musi być całkowita.

0
lukasz1235 napisał(a):

A mi przyszło do głowy żeby zamienić to na string, usunąć wszystko przed kropką i zamienić na inta. Tak, wiem, że głupie.

Również uważam że to najprostszy sposób z praktycznym wykorzystaniem :) w zmiennej c mamy część całkowitą a w u - ułamkową

   string tb = textBox1.Text, c = "", u = "";
            if (textBox1.Text.Contains(".")) { tb = tb.Replace(".", ","); textBox1.Text = tb; }
                        
            for ( int i = 0; i < tb.IndexOf(",") ; i++)
            {
                c += tb[i].ToString();
            }
            for (int i = tb.IndexOf(",")+1; i < tb.Length; i++)
            {
                u += tb[i].ToString();
            }

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