我有一个解决方程式的程序,有时候解x1
和x2
是带有很多十进制数的数字。例如,当Δ = 201
(Δ=判别)时,平方根给出一个浮点数。
我需要对该数字进行良好的近似,因为我还有一个将其转换为分数的函数。所以我想这样做:
Result := FormatFloat('0.#####', StrToFloat(solx1));
solx1
是双倍的。这样,数字'456,9067896'变为'456,90679'。
我的问题是:如果我以这种方式近似,456,9067896
的分数是正确的(并且相同)如果我有456,90679
?
答案 0 :(得分:5)
如果我有456,9067896
,
456,90679
的分数是正确的(并且相同)?
不,因为0.9067896
不等于0.90679
。
但你为什么要围绕这些数字呢?让他们保持原样。缩短它们仅用于视觉表现。
答案 1 :(得分:2)
如果您担心结果的完整正确性,则根本不应使用浮点数,因为根据定义,浮点数是实数的四舍五入。只有32位浮点的前5-6个十进制数字通常是可靠的,由于机器错误,以下几个不可靠。
如果你想要完全精确,你应该使用符号数学(有理数和符号表示无理/虚数)。
答案 2 :(得分:2)
要比较具有给定精度的两个浮点值,只需使用SameValue()
函数from Math unit或其sibbling CompareValue().
if SameValue(456.9067896, 456.90679, 1E-5) then ...
您可以指定比较的精度。
或者您可以使用currency
值,该值具有4位数的固定算术精度。所以,它不会再有舍入问题了。但你不能用它做所有的数学计算(大数或小数都没有得到妥善处理):它主要用于会计计算。
你最好不要使用string
表示来比较浮点数,因为它可能非常混乱,并且没有良好的舍入能力。