String to Single

Signaler
Messages postés
403
Date d'inscription
mercredi 19 avril 2006
Statut
Membre
Dernière intervention
7 août 2020
-
Messages postés
2235
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
15 septembre 2020
-
Bonjour,

Quelqu'un pourrait m'expliquer pourquoi ce code :

dim text as string = "123456789.88"
dim sng as single = text


Donne comme résultat :
sng = 12345679

Merci d'avance

6 réponses

Messages postés
14749
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 septembre 2020
433
Bonjour

Deux possibilités, donc pour discerner peux tu essayer

Dim sng as Single = Convert.ToSingle(text)

Messages postés
2235
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
15 septembre 2020
113
Bonjour
1) Dans tout projet il est plus que conseillé de mettre les Option Strict et Option Explicit sur On ( voir image qui suit ) avec les propriétés de ton projet dans le menu Projet


Option Strict t'oblige à déclarer toutes tes variables avec un type
Option Explicit oblige à ce que les conversions entre type de variables soient codées par le programmeur . Elles ne sont plus automatiques .

Dans ton code
dim text as string = "123456789.88"
dim sng as single = text



text est une chaine de caractères et sng est de type numérique single . C'est mélanger les torchons et les serviettes .
Whismeril dans son bout de code t'a montrer la conversion à faire ( un salut à lui en passant )
En passant aussi text est un nom de propriété pour les contrôles visuels ( Label.Text, TextBox.Text, etc ... ) . Il vaut mieux éviter de s'en servir comme nom de variable

Messages postés
14749
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 septembre 2020
433
Salut, en fait j’attendais le résultat du test pour lui parler de ça
Messages postés
2235
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
15 septembre 2020
113
Autre chose : chez moi avec Visual Studio Community 2019 le code déclenche une erreur . il faut remplacer le point par une virgule
Messages postés
14749
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 septembre 2020
433
C’est parce que sur ton pc le symbole decimal c’est la virgule.

Messages postés
2235
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
15 septembre 2020
113
Salut Whis
Exact c'est ce je me suis dit ensuite .
A bientôt 70 ans on ne percute plus aussi vite lol !
A ++
Messages postés
403
Date d'inscription
mercredi 19 avril 2006
Statut
Membre
Dernière intervention
7 août 2020
1
Bonjour,

Effectivemment mon exemple ne respectait pas les conventions et bonnes pratiques, mais cela ne change pas le problème :

Dim NbString As String = "123456789,88"
Dim NbSingle As Single
NbSingle = CSng(NbString) '123456792
NbSingle = Convert.ToSingle(NbString, New Globalization.CultureInfo("fr-FR")) '123456792
NbSingle = Single.Parse(NbString, Globalization.NumberStyles.Float) '123456792
NbSingle = Single.Parse(NbString, Globalization.NumberStyles.Number) '123456792
NbSingle = Single.Parse(NbString, Globalization.NumberStyles.Currency) '123456792


D'après ce que j'ai pu récupérer comme info, c'est une limitation de la variable single
https://social.msdn.microsoft.com/Forums/vstudio/en-US/921a8ffc-9829-4145-bdc9-a96c1ec174a5/decimal-vs-double-difference

C# Type .Net Framework (System) type Signed? Bytes Occupied Possible Values
sbyte System.Sbyte Yes 1 -128 to 127
short System.Int16 Yes 2 -32768 to 32767
int System.Int32 Yes 4 -2147483648 to 2147483647
long System.Int64 Yes 8 -9223372036854775808 to 9223372036854775807
byte System.Byte No 1 0 to 255
ushort System.Uint16 No 2 0 to 65535
uint System.UInt32 No 4 0 to 4294967295
ulong System.Uint64 No 8 0 to 18446744073709551615
float System.Single Yes 4 Approximately ±1.5 x 10-45 to ±3.4 x 1038 with 7 significant figures
double System.Double Yes 8 Approximately ±5.0 x 10-324 to ±1.7 x 10308 with 15 or 16 significant figures
decimal System.Decimal Yes 12 Approximately ±1.0 x 10-28 to ±7.9 x 1028 with 28 or 29 significant figures
char System.Char N/A 2 Any Unicode character (16 bit)
bool System.Boolean N/A 1 / 2 true or false



J'ai donc passé ma variable en double.

Messages postés
14749
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 septembre 2020
433
Effectivemment mon exemple ne respectait pas les conventions et bonnes pratiques, mais cela ne change pas le problème :

Ben en fait ça aurait pu, en laissant le compilateur faire comme il veut, on est parfois surpris du résultat.


c'est une limitation de la variable single
je ne suis pas certain que le terme limitation du type soit parfaitement approprié, moi je dirais que c’est la nature du type qui fait que seuls une quantité limité de nombres sont définis avec un type basé sur la virgule flottante, single, double, decimal etc....
Plus le nombre de bits utilisés est important plus la quantité de nombres « possible » l’est aussi.

De plus, à moins d’utiliser des classes ou faire appel à des composants externes réclamant des floats, tu ne gagnes rien à utiliser ce type en .Net, en effet, quoiqu’il arrive il est codé sur 32 ou 64 bits (selon tes options de compilation), les bits inutiles valant 0 => pas de
gain de RAM, plus de temps de conversation.
Messages postés
321
Date d'inscription
samedi 18 décembre 2004
Statut
Non membre
Dernière intervention
2 septembre 2020
2
Bonjour,
En utilisant le langage de programmation Opera disponible à CodeS-SourceS je peux écrire :
sng = 123456789.88 ce qui fournit et archive la fraction : 3086419747/25 et je peux ensuite
effectuer toutes les opérations arithmétiques mathématiquement exactes que je souhaite
avec la variable sng ou bien avec d'autres, exemple : nb = 123456789012345678901234.567
Bien entendu, c'est utilisable, mais ce n'est pas du code VB.NET. Cordialement, pgl10