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

Emi*_*nem 4 delphi floating-point

使用DEFAULT FloatToStr函数

FloatToStr('0.0000442615029219009')
Run Code Online (Sandbox Code Playgroud)

输出

4.42615029219009E-5
Run Code Online (Sandbox Code Playgroud)

小数点后丢一个零

FloatToStr('0.000442615029219009')
Run Code Online (Sandbox Code Playgroud)

产生

0.000442615029219009
Run Code Online (Sandbox Code Playgroud)

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

4.42615029219009E-4
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 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.
Run Code Online (Sandbox Code Playgroud)

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

如果你希望你的输出始终用科学记数法,然后使用Formate 格式字符串.


QC#107388