Julia. Les premiers pas, sixième partie

3. Conversion entre types de données

using Dates

let # portée locale
    d = Dates.now()
    println("Daniel Hagnoul $d\n")
end
Daniel Hagnoul 2020-11-02T10:32:05.564

Nous avons souvent besoin de convertir des données d'un type à un autre afin de tirer parti des fonctions de bibliothèque existantes.

Un bon exemple de ce travail serait les types de données numériques standard.

Il existe deux façons de convertir une valeur d'un type de données à un autre.

Par exemple, nous pouvons construire un objet Float64 à partir d'un nombre rationnel comme suit:

x = Float64(1//3)
0.3333333333333333
convert(Float64, 3//7)
0.42857142857142855

Si l'on considère la performence, il est plus avantageux d'utiliser convert().

Il est important de déterminer si la conversion est sans perte ou avec perte.

En raison de la représentation numérique des nombres à virgule flottante, une conversion parfaite n'est pas toujours possible.

convert(Rational, x)
6004799503160661//18014398509481984

Il n'est pas possible de reconstruire 1//3 après sa conversion en Float64.

Utiliser BigFloat améliore la précision, mais ne garantit pas le succès de la conversion à rebours.

y = convert(BigFloat, 1//3)
z = convert(Rational, y)

println(y, "\n", z, "\n")

a = convert(BigFloat, 2^53 + 1)
b = convert(Int64, a)

println(a, "\n", b)
0.3333333333333333333333333333333333333333333333333333333333333333333333333
333348
771947261582107969490473233391252719021799897770937093596383893386087530932
91//23158417847463239084714197001737581570653996933128112807891516801582625
9279872

9.007199254740993e+15
9007199254740993

Conseil

Plus vous utilisez votre système de typage, plus il fonctionne pour vous.

Si vous n'utilisez que des types primitifs, n'attendez pas beaucoup plus qu'un comportement primitif pour votre système de types.

Utilisez des types riches pour décrire votre domaine et vous constaterez que votre système de type applique réellement votre domaine !

Licence Creative Commons Attribution 2.0 Belgique