String to Single

lesdis Messages postés 403 Date d'inscription mercredi 19 avril 2006 Statut Membre Dernière intervention 7 août 2020 - Modifié le 6 août 2020 à 20:32
vb95 Messages postés 3474 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 7 mai 2024 - 7 août 2020 à 19:42
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

A voir également:

6 réponses

Whismeril Messages postés 19040 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 mai 2024 656
6 août 2020 à 13:02
Bonjour

Deux possibilités, donc pour discerner peux tu essayer

Dim sng as Single = Convert.ToSingle(text)

0
vb95 Messages postés 3474 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 7 mai 2024 169
Modifié le 6 août 2020 à 18:50
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

0
Whismeril Messages postés 19040 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 mai 2024 656
6 août 2020 à 20:03
Salut, en fait j’attendais le résultat du test pour lui parler de ça
0
vb95 Messages postés 3474 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 7 mai 2024 169
7 août 2020 à 01:25
Autre chose : chez moi avec Visual Studio Community 2019 le code déclenche une erreur . il faut remplacer le point par une virgule
0
Whismeril Messages postés 19040 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 mai 2024 656
7 août 2020 à 08:07
C’est parce que sur ton pc le symbole decimal c’est la virgule.

0
vb95 Messages postés 3474 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 7 mai 2024 169
7 août 2020 à 19:42
Salut Whis
Exact c'est ce je me suis dit ensuite .
A bientôt 70 ans on ne percute plus aussi vite lol !
A ++
0
lesdis Messages postés 403 Date d'inscription mercredi 19 avril 2006 Statut Membre Dernière intervention 7 août 2020
Modifié le 7 août 2020 à 10:00
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.

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19040 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 mai 2024 656
7 août 2020 à 11:57
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.
0
pgl10 Messages postés 382 Date d'inscription samedi 18 décembre 2004 Statut Membre Dernière intervention 1 mai 2024 11
7 août 2020 à 13:01
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
0
Rejoignez-nous