web-dev-qa-db-fra.com

Diviser le double en deux int, un int avant le point décimal et un après

Je dois diviser une valeur double, en deux valeurs int, une avant la virgule et une après. Le int après le point décimal devrait avoir deux chiffres.

Exemple:

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

Voici comment vous pouvez le faire:

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

La manipulation des chaînes peut être lente. Essayez d'utiliser ce qui suit:

double number;

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

Quel langage de programmation que vous voulez utiliser pour faire cela? La plupart des langues devraient avoir un opérateur Modulo . Exemple C++:

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);
}

Usage:

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

Une autre variante qui n'implique pas de manipulation de chaîne:

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();
}

Assurez-vous qu'ils sont décimaux ou que vous obtenez le comportement étrange habituel float/double.

2
Chris S

Cette fonction prendra du temps en décimal et sera reconvertie en base 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

vous pouvez diviser avec de la ficelle, puis convertir en int ...

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

Essayer:

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

En réalité, je devais simplement répondre à cette question dans le monde réel et, bien que la réponse de @David Samuel en fasse partie, voici le code résultant que j'ai utilisé. Comme dit précédemment, les cordes sont beaucoup trop lourdes. Je devais faire ce calcul sur des valeurs de pixel dans une vidéo et j'étais toujours capable de maintenir 30 images par seconde sur un ordinateur modéré. 

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*

Cela a été utilisé pour résoudre x, y à partir du nombre de pixels dans le flux vidéo 640 x 480. 

0
davidbates

Vous pouvez le faire sans passer par les chaînes. Exemple:

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+")");
}

Sortie:

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

Ne fonctionnera pas pour un nombre comme -0.123, cependant. Là encore, je ne sais pas comment cela s’adapte à votre représentation.

0
Vlad

Utilisation de Linq. Juste une clarification de la réponse de @Denis.

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

que diriez-vous?

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