-1

我有一个程序可以解决方程,有时是解决方案x1,并且x2是带有很多十进制数的数字。例如,当Δ = 201(Δ=判别式)平方根给我一个浮点数。

我需要一个很好的近似值,因为我还有一个函数可以将它转换成分数。所以我想这样做:

 Result := FormatFloat('0.#####', StrToFloat(solx1)); 

solx1双。这样,数字“456,9067896”变为“456,90679”。

我的问题是:如果我以这种方式近似,如果我有 的分数456,9067896将是正确的(并且相同)456,90679

4

3 回答 3

5

如果我有的分数456,9067896将是正确的(并且相同)456,90679

不,因为0.9067896不等于0.90679

但是你为什么要四舍五入呢?就让他们保持原样吧。缩短它们仅用于视觉表示。

于 2013-10-26T10:22:25.763 回答
2

如果您担心结果的完全正确性,则根本不应该使用浮点数,因为根据定义,浮点数是实数的四舍五入。一般只有前 5-6 位 32 位浮点数的十进制数字是可靠的,后面的不可靠,由于机器错误。

如果您想要完全精确,您应该使用符号数学(有理数和无理数/虚数的符号表示)。

于 2013-10-26T10:28:10.487 回答
2

要以给定的精度比较两个浮点值,只需使用数学单元或其兄弟中的SameValue()函数CompareValue().

if SameValue(456.9067896, 456.90679, 1E-5) then ...

您可以指定进行比较的精度。

或者,您可以使用currency具有 4 位固定算术精度的值。所以,它不会再有四舍五入的问题了。但是你不能用它来做所有的数学计算(巨大或微小的数字都没有被正确处理):它的主要用途是会计计算。

最好不要使用string表示来比较浮点数,因为它可能会非常混乱,并且没有很好的舍入能力。

于 2013-10-26T13:57:44.370 回答