[Résolu] Précision flottante NSNumber

kaseykasey Membre
août 2008 modifié dans API AppKit #1
Bonjour,

Je rencontre un petit problème dans l'utilisation de NSNumber ou NSDecimalNumber et accessoirement de son formatage.

Je pense que le code est plus parlant qu'un long discours :

<br />&nbsp; &nbsp; &nbsp; &nbsp; float origine = 123456789.125 ;<br />	NSLog(@&quot;Origine&nbsp; : %0.3f&quot;, origine);<br />	<br />	NSDecimalNumber *four = [[NSDecimalNumber alloc] initWithFloat:123456789.125];<br />	NSLog(@&quot;Float&nbsp; &nbsp;: %f&quot;, four);<br />	<br />	NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];<br />	<br />	[numberFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];<br />	[numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];		<br />	[numberFormatter setRoundingMode:NSNumberFormatterRoundCeiling];	<br />	[numberFormatter setThousandSeparator:@&quot;&#39;&quot;];						<br />	[numberFormatter setDecimalSeparator:@&quot;,&quot;];							<br />	[numberFormatter setGroupingSize:3];								<br />	[numberFormatter setAllowsFloats:TRUE];								<br />	[numberFormatter setAlwaysShowsDecimalSeparator:TRUE];				<br />	[numberFormatter setMaximumFractionDigits:1];							<br />&nbsp; &nbsp; &nbsp; &nbsp; [numberFormatter setGeneratesDecimalNumbers:YES];<br />	<br />	NSLog(@&quot;Format&nbsp; : %@&quot;, [numberFormatter stringFromNumber:four]);


Le résultat est très exotique du fait je pense que ma valeur est trop grande pour être contenue dans un simple float ou NSNumber

2008-08-04 16:42:12.415 MiseEnForme[5442:10b] Origine&nbsp; : 123456792.000<br />2008-08-04 16:42:12.417 MiseEnForme[5442:10b] Float&nbsp; &nbsp;: 353206826085862497113622027768969418236603717132235932614787072.000000<br />2008-08-04 16:42:12.418 MiseEnForme[5442:10b] Format&nbsp; : 123&#39;456&#39;792,1


Quelqu'un aurais une piste a me donner sur le travail et le formatage de données de taille importante?

Réponses

  • NoNo Membre
    15:33 modifié #2
    four est un objet, donc tu ne peux pas faire :
    [tt]NSLog(@Float  : %f, four)[/tt]

    à  la place fait :
    [tt]NSLog(@Float ; : %@", four)[/tt]

    ou mieux
    [tt]NSLog(@Float  : %f, [four floatValue])[/tt]
  • Philippe49Philippe49 Membre
    15:33 modifié #3
    Le format %0.3f signifie écrire avec 0 caractères dont trois chiffres après la virgule. Il est clair que cette demande ne peut pas être satisfaite. dans ce cas le C fait au mieux. Une demande acceptable ici serait %13.3f, car il y a 13 caractères en tout, ou %.3f sans précision du nombre de caractères à  utiliser.
    Ceci dit, il y a effectivement sans doute trop de chiffres significatif pour un float.
  • kaseykasey Membre
    août 2008 modifié #4
    Correctement réécrits mes logs donnent :

    2008-08-04 17:30:22.463 MiseEnForme[5626:10b] Origine : 123456792.000<br />2008-08-04 17:30:22.465 MiseEnForme[5626:10b] Float&nbsp; &nbsp;: 123456792<br />2008-08-04 17:30:22.466 MiseEnForme[5626:10b] Format&nbsp; : 123&#39;456&#39;792,1
    


    Mais la valeur est toujour différente de 123456789.125
    Comment faire pour passer sur des variables plus grandes, comme par exemple de l'int au long ?

    Et surtout avec les objets fournis par apple du genre NSNumber  ???
  • schlumschlum Membre
    15:33 modifié #5
    Travaille avec des "double" ou des "long double"...
    "float" n'est pas assez précis pour ce que tu veux apparemment.
  • kaseykasey Membre
    août 2008 modifié #6
    Et pour ce qui est du formatage je suppose que je vais devoir réaliser celui-ci a la main, ainsi que pour les NSNumber et autres objets d'apple?
  • schlumschlum Membre
    15:33 modifié #7
    Comment ça ? NSNumber est capable de travailler avec double...  ???
  • kaseykasey Membre
    15:33 modifié #8
    Mais tout à  fait !!!!!

    Il ce trouve que j'avais juste oublier de remplacer le initWithFloat par un initWithDouble  :)beta:

    Merci pour tout
Connectez-vous ou Inscrivez-vous pour répondre.