2013-06-29 22 views
10

folgenden Code vor:C++ Typ Umwandlung Ausgabe

#include <iostream> 

using namespace std; 

int aaa(int a) { 
    cout << a * 0.3 << endl; 
    return a * 0.3; 
} 

int main() 
{ 
    cout << aaa(35000); 
} 

Es druckt:

10500 
10499 

Warum Ausgabe unterscheidet?

Ich habe einen Workaround, um "return a * 3/10;" aber ich mag es nicht.

Edit:

gefunden, das zu tun "return Schwimmer (a * 0,3);" gibt erwarteten Wert;

+0

' cout << a * 0.3 "verwenden Sie den Typ double als Ergebnis. aber in der zweiten Ausgabe übergeben Sie das Ergebnis vom int-Typ Filter. – Emadpres

Antwort

8

Das Ergebnis von 0,3 * 35000 ist eine Gleitkommazahl, nur geringfügig weniger als 10500. Wenn es gedruckt 10500 abgerundet ist, aber wenn sie in einen int die Nachkommastellen dazu gezwungen werden verworfen, in 10499. resultierenden

+0

Ist es nicht Compiler-spezifisch? gcc druckt 10500 in beiden Fällen – banarun

+1

Es ist. In der Tat kann 10500 * genau * als Gleitkommazahl dargestellt werden, und wenn die Multiplikation mit 64 Bit durchgeführt wird, sollte das Ergebnis 10500 * immer * sein. Die Sache ist, einige Systeme verwenden 80-Bit-Genauigkeit für Zwischenwerte. Dies macht 0,3 etwas weniger als 3/10, und wenn das Ergebnis der Multiplikation gerundet wird, ist es im letzten Bit falsch. – Joni

6

int * double Ausdruck ergibt doppelt, das ist, was die erste Sache druckt. Dann konvertieren Sie zu int hacken den verbleibenden Teil (auch wenn es fast da ist, sitzen bei 10500-DBL_EPSILON), und übergeben Sie das zurück. Die zweite gibt diesen Wert aus.

Float-Int-Konvertierungen sollten mit Vorsicht vorgenommen werden, besser gar nicht.

2

a * 0.3 hat Typ double. Der Anruf innerhalb aaa Anrufe

ostream& operator<< (double val); 

während derjenige außerhalb nennt

ostream& operator<< (int val); 

Sie würden eine Warnung erhalten (wenn Sie sie einschalten - Ich schlage vor, Sie tun), dass die implizite Umwandlung von double zu int wird nicht empfohlen.

+0

Erzähl mir mehr über -I Ich kann es nicht in meinen Code :: Blocks Compiler-Einstellungen finden. Zumindest wie man es googelt. – user2534633

+0

@ user2534633 Ich wie in mir selbst ... Ich schlage vor, Sie schalten sie ein :) –