2013-06-03 4 views
0

Я использую FloatToStr(), но у него есть ошибка! Я покажу вам свой саркод.C++ builder Ошибка FloatToStr()

void __fastcall TForm1::FormCreate(TObject *Sender) 
{ 
float i=3.14; 
Double j=3.14; 
Double k=0; 
Double m,n; 

Edit1->Text=FloatToStr(i);   // It's show 3.14000010490417 
Edit2->Text=FloatToStr(j);   // It's show 3.14 

Edit3->Text=FloatToStr(314/100); // It's show 3 

k=314/100; 
Edit4->Text=FloatToStr(k);   // It's show 3 

m=314; 
n=100; 
Edit5->Text=FloatToStr(m/n);  // It's show 3.14 

} 

Я спрашиваю? Зачем ? Все не показывают 3.14 ???? !!! или Это ошибка в FloatToStr()!

  1. Редактировать1-> Текст = FloatToStr (i); // Это шоу 3.14000010490417
  2. Редактировать3-> Текст = FloatToStr (314/100); // Это шоу 3
  3. Edit4-> Text = FloatToStr (k); // Это шоу 3

Благодарим за ответ.

+2

1) float не может точно представлять 3.14, поэтому у вас есть ошибка, которая показывает, когда он получает повышение до double при передаче в FloatToStr(). 2 и 3) вы выполняете целочисленное деление (314/100), поэтому результат усекается. Попробуйте (314.0/100) использовать деление с плавающей запятой. –

ответ

2

Вы получаете разные результаты, потому что вы смешиваете целочисленное деление с делением с плавающей запятой в вашем коде. Целочисленное деление усекает все после десятичной точки.

// This line is performing integer division 
// and the final result is passed into FloatToStr. 
// aka it's the same as calling FloatToStr(3). 
Edit3->Text=FloatToStr(314/100); 

// Again, the right-hand side is doing integer division 
// and the result is implicitly casted to a double. 
// aka it's the same as doing k = static_cast<double> (3); 
k = 314/100; 
Edit4->Text=FloatToStr(k);   // It's show 3 

// These two lines implicitly casts int to a double 
// when assigned in this manner. 
m = 314; 
n = 100; 
// Now this is performing double division so you 
// get the expected result. It's the same as calling 
// Edit5->Text=FloatToStr(314.0/100.0); 
Edit5->Text=FloatToStr(m/n);  // It's show 3.14 
0

Проблема почему поплавок не имеет ровно 3,14 является тот факт, что все числа в компьютере хранятся в двоичном коде, числа с плавающей запятой, записанные в десятичном коде, не может точно преобразовать в двоичный код.

Число, записанное на большее количество бит, является лучшим приближением.


Посмотрите:

http://docwiki.embarcadero.com/RADStudio/XE4/en/Internal_Representation_Of_Numerical_Types

длинный двойной (C++) = Extended (Delphi, Builder)

number = <Significand> * 2^<Biased_exponent> 
    // (there's also the sign bit, etc.) 

Смотрите, что <Biased_exponent> не сила 10 , поэтому трудно получить хорошее приближение.


Другая помощь документ:

http://docwiki.embarcadero.com/RADStudio/XE4/en/Constants_And_Internal_Representation


Edit:

Конечно проблема заключается в операции деления:

int/int = int   
double/int = double 
+0

Нет, это целочисленное деление –

0

Выражение 314/100 RESU lts целое число, потому что вы делите 2 целых значения. Если вы хотите разделить операции с плавающей запятой, вы должны использовать выражение 314.0/100.0

Использование десятичного разделителя (.) В статическом номере в коде делает компилятор использующим его как значение с плавающей запятой.

Смежные вопросы