gpt4 book ai didi

delphi - 为什么FloatToText在不同的项目中会返回不同的值?

转载 作者:行者123 更新时间:2023-12-03 18:16:18 24 4
gpt4 key购买 nike

我以这种方式使用 FloatToText:

function ExFloatToStr(Value: Extended): string;
var
Buffer: array[0..63] of Char;
FormatSettings: TFormatSettings;
begin
GetLocaleFormatSettings(GetUserDefaultLCID, FormatSettings);
SetString(Result, Buffer, FloatToText(Buffer, Value, fvExtended, ffGeneral,
18, 0, FormatSettings));
end;

如果我传递给这个函数值 9229.99,它返回一个字符串值 9229.9900000000016,但这不是我想要的。当我创建一个新项目并将上面的代码复制到那里时,它运行良好。它返回 9229.99。

他们在不同项目中工作方式不同的原因可能是什么?

最佳答案

这其实是一个可表示性的问题。这是 SSCCE:

{$APPTYPE CONSOLE}

uses
SysUtils, Windows;

function ExFloatToStr(Value: Extended): string;
var
Buffer: array[0..63] of Char;
FormatSettings: TFormatSettings;
begin
GetLocaleFormatSettings(GetUserDefaultLCID, FormatSettings);
SetString(Result, Buffer, FloatToText(Buffer, Value, fvExtended, ffGeneral,
18, 0, FormatSettings));
end;

var
X: Double;
Y: Extended;

begin
X := 9229.99;
Y := 9229.99;
Writeln(ExFloatToStr(X));
Writeln(ExFloatToStr(Y));
Readln;
end.

输出

9229.989999999999789229.99

您要求 18 位数字。当您将值存储为 double 时,存储的值将变得不精确到 18 位十进制数字精度。 double 值具有 15-16 位有效的小数位精度。并且小于 18。当您将该值存储为扩展值时,可用的精度更高,足以将您的值准确存储到您要求的 18 位小数精度。

关于这个问题,我总是引用 Rob Kennedy 的优秀页面:http://pages.cs.wisc.edu/~rkennedy/exact-float?number=9229.99

这告诉我们,当转换为扩展和 double 值时,您的值表示为:

9229.99 = + 9229.99000 00000 00000 21316 28207 28030 05576 13372 80273 43759229.99 = + 9229.98999 99999 99781 72127 15744 97222 90039 0625

这与上面的输出完全吻合。

因此,我希望您会发现,在您现有的项目中,您会在某个时候将值存储到 double 变量中。那时你失去了 Extended 的额外精度。

就其值(value)而言,我认为 80 位扩展类型是不合时宜的。它仅在 Intel 芯片上受支持,并且仅由 32 位编译器使用。根据我的经验,它从来没有比 double 提供任何真正的好处。由于内存对齐,它的性能很差。作为大量浮点代码的作者,我从不使用扩展。

关于delphi - 为什么FloatToText在不同的项目中会返回不同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22063157/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com