gpt4 book ai didi

Delphi - 使用 FormatFloat ('0.##' 时浮点舍入不一致,argValue)

转载 作者:行者123 更新时间:2023-12-01 23:21:15 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Is floating point math broken?

(31 个回答)


3年前关闭。




尝试使用函数 FormatFloat 将 double 值四舍五入到小数点后两位(格式字符串 '0.##' )。

以下是inputoutput值(value)观
231.545 -> 231.54 (but expected output is 231.55)2.315 -> 2.31 (but expected output is 2.32)23.045 -> 23.05 (gives expected output 23.05)23.145 -> 23.14 (but expected output 23.15)23.245 -> 23.25 (gives expected output 23.25)23.345 -> 23.34 (but expected output 23.35)23.445 -> 23.45 (gives expected output 23.45)23.545 -> 23.55 (gives expected output 23.55)23.645 -> 23.65 (but expected output 23.64)23.745 -> 23.75 (gives expected output 23.75)23.845 -> 23.84 (but expected output 23.84)23.945 -> 23.95 (gives expected output 23.95)
为什么会发生这种奇怪的行为?我正在使用德尔福 7。

最佳答案

二进制浮点值不能准确地表示每个值。这就是你所看到的。

例如,值 2.315以 double 表示:

2.31499 99999 99999 94670 92948 17992 48605 96656 79931 64062 5

这将四舍五入为 2.31
如果您可以使用十进制数据类型,例如 currency ,您可以获得想要的输出(如果货币在您的工作范围内):
var
c : Currency;
begin
c := 2.315;
WriteLn(FormatFloat('0.##',c)); // Outputs 2.32
end.

另一种方法是使用小数库,例如 BigDecimals ,但这需要一个现代的 Delphi 版本,并支持带有方法的记录。

关于Delphi - 使用 FormatFloat ('0.##' 时浮点舍入不一致,argValue),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53708173/

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