0

我使用 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. Edit1->Text=FloatToStr(i); // 显示 3.14000010490417
  2. Edit3->Text=FloatToStr(314/100); // 显示 3
  3. Edit4->Text=FloatToStr(k); // 显示 3

感谢您的回答。

4

3 回答 3

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
于 2013-06-03T06:23:10.333 回答
0

表达式 314/100 产生一个整数,因为您将 2 个整数值相除。如果要使用浮点运算进行除法,则应使用表达式 314.0 / 100.0

在代码中的静态数字中使用小数点分隔符 (.) 会使编译器将其用作浮点值。

于 2013-07-03T11:27:43.527 回答
0

浮点数为什么不完全保持 3.14 的问题是,计算机中的所有数字都是以二进制代码存储的,用十进制代码编写的浮点数不能完全转换为二进制代码。

该数字写在更多的位上是一个更好的近似值。


看:

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

long double (C++) = 扩展 (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


编辑:

当然问题在于除法运算:

int / int = int        
double / int = double
于 2013-06-11T10:23:34.000 回答