2014-03-06 31 views
0

在Delphi XE2中使用double类型时,我得到的计算结果无效。以下代码是一个非常简单的计算结果,应该为零。相反,它返回-1.13686837721616E-13,这是不正确的。为什么Delphi XE2不正确地计算double值?

var 
    dblValue1, dblValue2, dblValue3, dblTotal: double; 
begin 
    try 
    dblValue1 := 1671.37; 
    dblValue2 := 871.37; 
    dblValue3 := 800.00; 

    dblTotal := (dblValue1 - dblValue3); 
    dblTotal := (dblTotal - dblValue2); 
    Write(FloatToStr(dblTotal)); 
    ReadLn; 
    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 

这与32位或64位构建失败相同。

为什么计算失败?

+2

计算不会失败。使用双打,舍入错误是可以预料的。这与双打允许的一样正确。 – towr

回答

2

它不会失败 - 你正好碰上了在浮点运算的计算机上的任何表示固有的精度的限制。为了便于比较,我只是想同减法在交互式Python外壳:

>>> a = 1671.37 
>>> b = 871.37 
>>> a - b 
799.9999999999999 

的解决方案是要么接受浮点运算的极限,你的答案四舍五入到所需的精度;或者切换到另一种数字表示。例如,由于这些值使用两位小数(美元和美分?),您可以将它们乘以100,并使用整数(除以100仅用于显示目的,如果需要的话)。然后是二进制编码的十进制数和任意的精度......我不知道你在Delphi中如何做,但根据你的应用程序它们可能是矫枉过正的。

+0

'Currency'在这种情况下比'Integer'好得多;) –

+0

我们最初使用的货币非常适合我们的需求,但随后开始创建我们的应用程序的64位编译。那时候我们发现了这个错误(Embarcadero验证了他们会在XE6中修复这个错误),这个错误使我们看到了使用双打的情况: http://stackoverflow.com/questions/21890858/why-is-64-bit-delphi -app算出用不同-结果高于32位的构建 –

1

嗯,我恰好有在Python相同的结果;)

Python 2.7.6 (default, Feb 24 2014, 16:00:34) 
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.2.79)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> a = 1671.37 
>>> b = 871.37 
>>> c = 800.00 
>>> t = a - c 
>>> t = t - b 
>>> print t 
-1.13686837722e-13 
>>> 

浮点算术不是100%准确的(我只知道它是复杂的解释浮点数是如何在内部表示记忆)。

请在这里读到这样的回答:

https://stackoverflow.com/a/2080642/756056

+0

谢谢你的帖子。回顾您的链接后,所有内容都会回复给我。 –

相关问题