Conversion d'une chaîne en flottant en C #

108

Je convertis une chaîne comme "41.00027357629127", et j'utilise;

Convert.ToSingle("41.00027357629127");

ou

float.Parse("41.00027357629127");

Ces méthodes renvoient 4.10002732E + 15 .

Quand je passe au flottant, je veux "41.00027357629127". Cette chaîne doit être la même ...

Mehmet
la source
1
Comment savez-vous à quoi il est converti - voilà comment
affichez-
1
Une idée de pourquoi c'est ToSingle? Et pas ToFloat?
Lord Darth Vader
41.00027357629127 ne doit pas être 4.10002732E + 15 en notation scientifique, à moins bien sûr que votre culture n'utilise une virgule décimale au lieu de la virgule décimale (et un point comme séparateur de milliers), de sorte que le nombre se lirait réellement: 4100027357629127 par conséquent s'affichera sous la forme 4.10002732E + 15
ljgww

Réponses:

229

Les paramètres régionaux de votre thread sont définis sur un dans lequel la marque décimale est "," au lieu de ".".

Essayez d'utiliser ceci:

float.Parse("41.00027357629127", CultureInfo.InvariantCulture.NumberFormat);

Notez, cependant, qu'un flottant ne peut pas contenir autant de chiffres de précision. Vous devrez utiliser double ou Decimal pour ce faire.

Matthew Watson
la source
35
n'oubliez pas d'ajouter l'espace using System.Globalization;de noms pour accéderCultureInfo
Mobiletainment
24

Tout d'abord, il s'agit simplement d'une présentation du floatnombre que vous voyez dans le débogueur. La valeur réelle est approximativement exacte (autant que possible).

Remarque: utilisez toujours les informations CultureInfo lorsque vous traitez des nombres à virgule flottante par rapport aux chaînes.

float.Parse("41.00027357629127",
      System.Globalization.CultureInfo.InvariantCulture);

C'est juste un exemple; choisissez une culture appropriée pour votre cas.

Tigran
la source
comment choisir mon CultureInfo? Je suis en Turquie où je vais ajouter TR-TR?
Mehmet
1
@Mehmetnew System.Globalization.CultureInfo("tr-TR")
sshow
20

Vous pouvez utiliser les éléments suivants:

float asd = (float) Convert.ToDouble("41.00027357629127");
user4292249
la source
4
Veuillez expliquer pourquoi c'est la bonne réponse.
Bas Peeters
7

Utilisation Convert.ToDouble("41.00027357629127");

Convert.ToDouble Documentation

Ozgur Dogus
la source
2
Cela ne change-t-il pas le type de données de float à double? OP voulait du flotteur.
Nell Martinez
4

La précision du float est de 7 chiffres. Si vous souhaitez conserver l'ensemble du lot, vous devez utiliser le type double qui garde 15-16 chiffres. Concernant le formatage, regardez un article sur le formatage des doubles . Et vous devez vous soucier des séparateurs décimaux en C # .

jpe
la source
ı fatigué double.Parse il retourne 4100027357629127.0 c'est dommage
Mehmet
2
Cela ressemble au "." le caractère n'est pas le séparateur décimal de votre langue? Découvrez stackoverflow.com/questions/3870154/c-sharp-decimal-separator
jpe
0

Vous pouvez double.Parse("41.00027357629127");

ABH
la source
Je ne pense pas qu'il demande comment le contourner.
OR Mapper
-2

Vous pouvez utiliser l'analyse avec double au lieu de float pour obtenir une valeur plus précise.

Apprenant
la source