我发现 Delphi 的 FormatFloat 函数有一个奇怪的行为。让我展示一下案例研究。
要转换的值:129809.495
所需的格式化输出:129,809.50
案例1:从字符串转换
var str: string;
str := '129809.495';
str := FormatFloat(',0.00', StrToFloat(str));
// output is 129,809.50 = CORRECT
案例 2:从双变量转换
var number: double;
str: string;
val := 129809.495;
str := FormatFloat(',0.00', val);
// output is 129,809.50 = CORRECT
案例 3:从数据集的字段转换
*it's too complex to write here, let me just explain*
Basically the formatted output of FormatFloat(',0.00', Dataset.Field[0].AsFloat);
always resulted in 129,809.49 == WRONG
我一直在使用 SQL Server 2008 和 Firebird 1.5 测试这种行为。
使用的组件是 ADO 组件和 UniDAC 组件(由 DevArt 提供),并且都具有相同的行为。
我试过做这些:
- FormatFloat(',0.00', Dataset.Field[0].AsFloat);
- FormatFloat(',0.00', StrToFloat(Dataset.Field[0].AsString));
- val := Dataset.Field[0].AsFloat; FormatFloat(',0.00', val);
- str := Dataset.Field[0].AsString; FormatFloat(',0.00', StrToFloat(str));
- val := StrToFloat(Dataset.Field[0].AsString); FormatFloat(',0.00', val);
但都导致相同的错误转换 0.49 而不是 0.50
一种有效的方法是
val := StrToFloat(Dataset.Field[0].AsString);
FormatFloat(',0.00', val);
有没有人为这种行为找到解决方案?因为强制转换 StrToFloat 然后重新格式化变量/输出的工作量太大。并且此解决方法不能应用于使用 FormatFloat 的第 3 方组件
任何帮助表示赞赏。谢谢