2016-04-29 5 views
0
def fc_range(start, end, step=1.0): 
    while start < end: 
     yield start 
     start +=step 
for x in fc_range(0, 1, 0.05): 
    print x # look the ans 
print list(fc_range(0, 1, 0.05)) # compare the ans now 

und wenn ich teste dies:warum 'print' kann einen genauen Wert geben, während andere nicht?

>>> 0.1 + 0.05 
0.15000000000000002 

wie es scheint klar zu sein, aber warum, wenn ich print verwenden, die Antwort ist nicht 0.15000000000000002?

+0

Was meinst du mit "wenn ich drucke, ist die Antwort nicht 0.1500000000000000002"? Es ist hier. – wRAR

Antwort

2

Um zu beginnen, sind Fließkomma-Mathematik nicht genau, da die meisten Fließkommazahlen nicht genau mit float dargestellt werden können.

Als Ergebnis ist der Wert von nicht genau 0.25, aber eine Zahl sehr nahe daran.


Der Grund, dass print gibt Ihnen ein scheinbar genaues Ergebnis ist, weil es str verwendet das Ergebnis zu erhalten, die die benutzerfreundliche String-Darstellung ist.

>>> str(0.1 + 0.05) 
'0.15' 

Der Python-Interpreter, auf der anderen Seite, repr verwendet, mit dem Sie die Darstellung als-Code-String gibt:

>>> repr(0.1 + 0.05) 
'0.15000000000000002' 
0

das, weil ist print Anrufe des Schwimmers __str__ Methode unter der Haube und aus irgendeinem Grund __str__ auf Floats macht Runden.

+0

Sie würden nicht wirklich wollen, __str__ '* nicht * zu runden, oder? Ohne Rundung würde "1/100.0" zum Beispiel als "0.01000000000000000020816681711721685132943093776702880859375" drucken. –

+0

@MarkDickinson Und was ist daran falsch? Du liegst lieber über der Wahrheit? Implizites Runden ist zumindest verwirrend. Ganz zu schweigen davon, dass Python nicht seinem eigenen Zen folgt: "Explizit ist besser als implizit". – freakish

+0

Was ist falsch daran ist, dass es eine wahnsinnige Anzahl von Ziffern für kleine oder große Schwimmer produziert. Zum Beispiel ergibt der wahre Wert, der für '1e-300' gespeichert ist, eine Zeichenkette der Länge 756, wenn sie genau geschrieben wird (750 Ziffern, ein Exponent und ein Dezimalpunkt). Also ja, im Sinne des Zen: "Praktikabilität schlägt Reinheit", und es ist unpraktisch, alle 750 Ziffern zu zeigen. –

Verwandte Themen