使用 DEFAULT FloatToStr函数
FloatToStr('0.0000442615029219009')
输出
4.42615029219009E-5
在小数位后减去一个零
FloatToStr('0.000442615029219009')
产生
0.000442615029219009
有人可以解释为什么第二种情况下的值不会输出到
4.42615029219009E-4
答案 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
,因此使用固定表示法进行格式化。
如果您希望输出始终使用科学记数法,请将Format
与e
format string一起使用。
答案 1 :(得分:1)
因为第一个示例中尾数中的有效位数超出了要显示的位数,请参阅
如果您想要更好地控制格式,请改用FloatToStrF函数。
编辑:有关位数的说明不正确,请参阅David Hefferman的答案以获得正确的解释。
答案 2 :(得分:1)
在某些时候FloatToStr
函数切换到指数格式以限制输出中的数字字符。否则,显示Double
可能需要最多300个十进制数字,这对于解释是不实际的。
您可以使用Format
函数指定严格的规则。