Question

Je suis actuellement déconner en FORTRAN 77 et je l'ai rencontré un problème que je ne peux pas sembler figurer dehors. Je suis en train de lire un fichier qui ressemble à ci-dessous:

000120     Description(s) here       18     7     10.15
000176     Description(s) here       65     20    56.95
...

La dernière colonne dans chaque rangée est un montant monétaire (jamais supérieur à 100). Je suis en train de lire le fichier en utilisant un code similaire à ci-dessous

          integer pid, qty, min_qty
          real price
          character*40 descrip

          open(unit=2, file='inventory.dat', status='old')
          read(2, 100, IOSTAT=iend) pid, descript, qty, min_qty, price
100       format(I11, A25, I7, I6, F5)

Tout semble être lu très bien, à l'exception de la dernière colonne. Quand je vérifie la valeur du prix, disons par exemple, pour la deuxième ligne; au lieu d'obtenir 56,95 je reçois quelque chose comme 56,8999999999.

Maintenant, je comprends que je pourrais avoir de fuite 9 ou de tout le reste, car il est pas tout à fait précis, mais il ne devrait pas être un peu plus de 95 cents? Peut-être il y a quelque chose que je fais mal, je ne suis pas sûr. Si tout va bien, je ne suis pas coincé avec mon programme en cours d'exécution comme ça! Toute aide est grandement appréciée!

Était-ce utile?

La solution

Est-ce exactement le code que vous utilisez pour lire le fichier? Avez-vous des formats « X » pour aligner les colonnes? Tels que (I11, A25, 2X, I7, 3 fois, I6, 3 fois, F5) (avec composé des valeurs). Si vous avez l'alignement de l'un et par lecture seule « 56,9 » pour « 56,95 », puis Imprécision virgule flottante pourrait facilement vous donner 56,89999, qui est très proche de 56,9

Vous pouvez également lire la ligne dans une chaîne et lire les nombres de sous-chaînes - cela nécessiterait seulement d'identifier avec précision l'emplacement de la chaîne. Une fois que les sous-chaînes ne contenaient que des espaces et des chiffres, vous pouvez utiliser un moins tatillonne IO dirigée lire:. Lire (string (30:80), *) qté, min_qty, prix

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top