4

使用DEFAULT FloatToStr 函数

FloatToStr('0.0000442615029219009')

输出

4.42615029219009E-5

小数点后去掉一个零

FloatToStr('0.000442615029219009')

生产

0.000442615029219009

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

4.42615029219009E-4
4

3 回答 3

11

文档FloatToStr包含答案:

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

要解释该声明,您还需要参考描述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,因此使用固定符号进行格式化。

如果您希望输出始终使用科学记数法,请使用Format格式e 字符串


质量控制#107388

于 2012-07-26T09:09:20.130 回答
1

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

Delphi 基础:FloatToStr

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

编辑:位数的解释不正确,请参阅大卫赫弗曼的答案以获得正确的解释。

于 2012-07-26T08:37:55.830 回答
1

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

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

于 2012-07-26T08:40:58.890 回答