使用DEFAULT FloatToStr 函数
FloatToStr('0.0000442615029219009')
输出
4.42615029219009E-5
小数点后去掉一个零
FloatToStr('0.000442615029219009')
生产
0.000442615029219009
有人可以解释为什么第二种情况下的值没有输出到
4.42615029219009E-4
使用DEFAULT FloatToStr 函数
FloatToStr('0.0000442615029219009')
输出
4.42615029219009E-5
小数点后去掉一个零
FloatToStr('0.000442615029219009')
生产
0.000442615029219009
有人可以解释为什么第二种情况下的值没有输出到
4.42615029219009E-4
的文档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
字符串。
因为第一个示例中尾数中的有效位数超过了要显示的位数,请参阅
如果您想更好地控制格式,请改用 FloatToStrF 函数。
编辑:位数的解释不正确,请参阅大卫赫弗曼的答案以获得正确的解释。
在某些时候,FloatToStr
函数会切换到指数格式以限制输出中的字符数。否则,显示 aDouble
可能需要多达 300 个十进制数字,这对于解释是不实际的。
您可以使用Format
函数来指定严格的规则。