Delphi FloatToStr - 为什么显示器不同?

时间:2012-07-26 08:28:20

标签: delphi floating-point

使用 DEFAULT FloatToStr函数

FloatToStr('0.0000442615029219009')

输出

4.42615029219009E-5

在小数位后减去一个零

FloatToStr('0.000442615029219009')

产生

0.000442615029219009

有人可以解释为什么第二种情况下的值不会输出到

4.42615029219009E-4

3 个答案:

答案 0 :(得分:11)

documentation for FloatToStr包含答案:

  

转换使用包含15位有效数字的通用数字格式。

要解释该陈述,您还需要参考topic describing the Format函数,特别是有关一般数字格式的文本(强调我的):

  

使用固定或科学格式将值转换为最短的十进制字符串。结果字符串中的有效位数由格式字符串中的精度说明符给出;如果不存在精度说明符,则假定默认精度为15。从结果字符串中删除尾随零,并且仅在必要时显示小数点。如果值中小数点左边的位数小于或等于指定的精度,则结果字符串使用定点格式;如果值大于或等于0.00001,则结果为 。否则结果字符串使用科学格式。

不幸的是,文档实际上存在错误。应该0.00001而不是0.0001。这个程序说明了这一点:

program FloatToStrScientificFixed;
{$APPTYPE CONSOLE}
uses
  System.SysUtils;

var
  d: Double;

begin
  d := 0.0001;
  Writeln(FloatToStr(d*0.9999999));
  Writeln(FloatToStr(d));
  Writeln(FloatToStr(d*1.0000001));
  Readln;
end.

对于您的示例,0.0000442615029219009小于0.0001,因此使用科学记数法进行格式化。但0.000442615029219009大于0.0001,因此使用固定表示法进行格式化。

如果您希望输出始终使用科学记数法,请将Formate format string一起使用。


QC#107388

答案 1 :(得分:1)

因为第一个示例中尾数中的有效位数超出了要显示的位数,请参阅

Delphi Basics: FloatToStr

如果您想要更好地控制格式,请改用FloatToStrF函数。

编辑:有关位数的说明不正确,请参阅David Hefferman的答案以获得正确的解释。

答案 2 :(得分:1)

在某些时候FloatToStr函数切换到指数格式以限制输出中的数字字符。否则,显示Double可能需要最多300个十进制数字,这对于解释是不实际的。

您可以使用Format函数指定严格的规则。