Forum und email

Αριθμοί κινητής υποδιαστολής

Αριθμοί κινητής υποδιαστολής (συμβολίζονται και ως "floats", "doubles" or "real numbers") μπορούν να προσδιοριστούν χρησιμοποιώντας οποιονδήποτε από τους ακόλουθους τρόπους σύνταξης:

<?php
$a 
1.234
$b 1.2e3
$c 7E-10;
?>
Formally:
LNUM          [0-9]+
DNUM          ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*)
EXPONENT_DNUM ( ({LNUM} | {DNUM}) [eE][+-]? {LNUM})
Το μέγετος ενός αριθμού κινητής υποδιαστολής δεν εξαρτάται από την πλατφόρμα, αν και ένας μέγιστος αριθμός περίπου ίσος με 1.8e308 με ακρίβεια σχεδόν 14 δεκαδικών ψηφίων είναι μια συνηθισμένη τιμή (αυτό είναι 64 bit IEEE format).

Warning

Ακρίβεια αριθμών κινητής υποδιαστολής

Συνηθίζεται σε απλές δεκαδικές παραστάσεις όπως 0.1 ή 0.7 να μην είναι εφικτή η μετατροπή τους σε εσωτερική δυαδική αντιστοίχιση χωρίς ένα μικρό χάσιμο σε ακρίβεια. Αυτό μπορεί να οδηγήσει σε διφορούμενα αποτελέσματα: για παράδειγμα, η floor((0.1+0.7)*10) συνήθως επιστρέφει 7 σε αντίθεση με το αναμενόμενο 8 αφού το αποτέλεσμα της εσωτερικής αναπαράστασης είναι κάτι σαν 7.9999999999....

Αυτό σχετίζεται με το γεγονός ότι είναι αδύνατο να εκφράσουμε ακριβώς μερικές παραστάσεις σε δεκαδική μορφή με έναν πεπερασμένο αριθμό ψηφίων. Για παράδειγμα, το 1/3 στη δεκαδική μορφή γίνεται 0.3333333. . ..

Συνεπώς μην εμπιστεύεστε ποτέ αποτελέσματα αριθμών κινητής υποδιαστολής μέχρι το τελευταίο ψηφίο και ποτέ μη συγκρίνεται για ισότητα αριθμούς κινητής υποδιαστολής. Αν θέλετε πραγματικά μεγαλύτερη ακρίβεια, θα πρέπει να χρησιμοποιείτε τις συναρτήσεις αυθαίρετης μαθηματικής ακρίβειας ή τη συνάρτηση gmp .

Μετατρέποντας σε αριθμό κινητής υποδιαστολής

Για περισσότερς πληροφορίες σχετικά με το πότε και πώς τα strings μετατρέπονται σε αριθμούς κινητής υποδιαστολής, δείτε το τμήμα με τον τίτλο Μετατροπή των strings σε αριθμούς. Για τιμές άλλων τύπων, η μετατροπή είναι η ίδια με αυτή που θα είχε η τιμή αν μετατρεπόταν πρώτα σε ακέραιο και μετά σε αριθμό κινητής υποδιαστολής. Δείτε το τμήμα Μετατρέποντας σε ακέραιο για περισσότερες πληροφορίες.