webentwicklung-frage-antwort-db.com.de

Doppelte in zwei int, ein int vor dem Dezimalpunkt und einen nach dem anderen

Ich muss einen doppelten Wert in zwei int-Werte aufteilen, einen vor dem Dezimalpunkt und einen nach dem anderen. Das int nach dem Komma sollte zwei Ziffern haben.

Beispiel:

    10.50 = 10 and 50
    10.45 = 10 and 45
    10.5  = 10 and 50
16
Scott Parker

So kannst du es machen:

string s = inputValue.ToString("0.00", CultureInfo.InvariantCulture);
string[] parts = s.Split('.'); 
int i1 = int.Parse(parts[0]);
int i2 = int.Parse(parts[1]);
24
Henk Holterman

Das Bearbeiten von Zeichenketten kann langsam sein. Versuchen Sie es mit folgendem:

double number;

long intPart = (long) number;
double fractionalPart = number - intPart;
16
user1032113

Mit welcher Programmiersprache möchten Sie dies tun? Die meisten Sprachen sollten einen Modulo-Operator haben. C++ - Beispiel:

double num = 10.5;
int remainder = num % 1
7
H4F
"10.50".Split('.').Select(int.Parse);
4
Denis
/// <summary>
/// Get the integral and floating point portions of a Double
/// as separate integer values, where the floating point value is 
/// raised to the specified power of ten, given by 'places'.
/// </summary>
public static void Split(Double value, Int32 places, out Int32 left, out Int32 right)
{
    left = (Int32)Math.Truncate(value);
    right = (Int32)((value - left) * Math.Pow(10, places));
}

public static void Split(Double value, out Int32 left, out Int32 right)
{
    Split(value, 1, out left, out right);
}

Verwendungszweck:

Int32 left, right;

Split(10.50, out left, out right);
// left == 10
// right == 5

Split(10.50, 2, out left, out right);
// left == 10
// right == 50

Split(10.50, 5, out left, out right);
// left == 10
// right == 50000
3
Vorspire

Eine weitere Variante, die keine String-Manipulation beinhaltet:

static void Main(string[] args)
{
    decimal number = 10123.51m;
    int whole = (int)number;
    decimal precision = (number - whole) * 100;

    Console.WriteLine(number);
    Console.WriteLine(whole);
    Console.WriteLine("{0} and {1}",whole,(int) precision);
    Console.Read();
}

Stellen Sie sicher, dass es sich um Dezimalzahlen handelt, oder Sie erhalten das übliche seltsame Verhalten von Float/Double.

2
Chris S

Diese Funktion benötigt Zeit in Dezimalzahlen und konvertiert zurück in Basis 60.

    public string Time_In_Absolute(double time)
    {
        time = Math.Round(time, 2);
        string[] timeparts = time.ToString().Split('.');                        
        timeparts[1] = "." + timeparts[1];
        double Minutes = double.Parse(timeparts[1]);            
        Minutes = Math.Round(Minutes, 2);
        Minutes = Minutes * (double)60;
        return string.Format("{0:00}:{1:00}",timeparts[0],Minutes);
        //return Hours.ToString() + ":" + Math.Round(Minutes,0).ToString(); 
    }
1
DareDevil

du kannst mit string aufteilen und dann in int konvertieren ...

string s = input.ToString(); 
string[] parts = s.Split('.');
1
Enigma State

Versuchen:

string s = "10.5";
string[] s1 = s.Split(new char[] { "." });
string first = s1[0];
string second = s1[1];
0
Shree

Ich musste das eigentlich nur in der realen Welt beantworten und während die Antwort von @David Samuel hier einen Teil davon trug, ist der resultierende Code, den ich verwendet habe. Wie gesagt, sind Strings viel zu viel Aufwand. Ich musste diese Berechnung über Pixelwerte in einem Video durchführen und konnte auf einem moderaten Computer immer noch 30 Bilder pro Sekunde beibehalten. 

double number = 4140 / 640; //result is 6.46875 for example

int intPart = (int)number; //just convert to int, loose the dec.
int fractionalPart = (int)((position - intPart) * 1000); //rounding was not needed.
//this procedure will create two variables used to extract [iii*].[iii]* from iii*.iii*

Dies wurde verwendet, um x, y aus der Pixelzahl in einer Video-Zufuhr von 640 x 480 zu lösen. 

0
davidbates

Sie können es tun, ohne durch die Saiten zu gehen. Beispiel:

foreach (double x in new double[]{10.45, 10.50, 10.999, -10.323, -10.326, 10}){
    int i = (int)Math.Truncate(x);
    int f = (int)Math.Round(100*Math.Abs(x-i));
    if (f==100){ f=0; i+=(x<0)?-1:1; }
    Console.WriteLine("("+i+", "+f+")");
}

Ausgabe:

(10, 45)
(10, 50)
(11, 0)
(-10, 32)
(-10, 33)
(10, 0)

Funktioniert jedoch nicht für eine Zahl wie -0.123. Andererseits bin ich mir nicht sicher, wie es zu Ihrer Darstellung passen würde.

0
Vlad

Linq verwenden Nur eine Klarstellung der Antwort von @Denis.

var splt = "10.50".Split('.').Select(int.Parse);
int i1 = splt.ElementAt(0);
int i2 = splt.ElementAt(2);
0
Maris B.

wie wäre es mit?

var n = 1004.522
var a = Math.Floor(n);
var b = n - a;
0
matthy