Flex的简单计算问题

时间:2010-01-20 09:27:10

标签: flex math floating-point

我在弹性计算方面遇到了麻烦,我试图将像素值转换为mm并将其反转。

从69.8开始:

Calculating MM to pixel from: 69.8 mm
69.8*300 = 20940
20940 / 2.54 = 8244.094488188975
8244.094488188975 / 10 = 824.4094488188975

计算回来:

Calculating pixel to MM from: 824.4094488188975
824.4094488188975/300 = 2.7480314960629917
2.7480314960629917 * 2.54 = 6.979999999999999
6.979999999999999 * 10 = 69.79999999999998

我们想要69.8,但结果是69.79999999999998。 我使用简单的窗口计算跟踪过程,第一个出错的地方是20940 / 2.54 = 8244.094488188975,应该是8244,094488188976。

Anny对此的帮助会很棒。

2 个答案:

答案 0 :(得分:7)

好的,这不是一个Flex问题,而是一般编程。你有没有想过如何将数字存储在计算机中?细节更多的是数学,但我会试着简单。您知道存在无数个不同的实数(例如,连续线上的点),但在您的计算机中,您将所有内容存储为零和1,以及有限数量(32或64“位”)。所以现在我们遇到了一个问题 - 如何在有限的空间内表示无限数量的数字。浮点数中使用的想法(可以使用像“1.03”或“4.2232”这样的“点”的值)是因为你不能拥有它们,所以你将数字四舍五入到最接近的数字。

这有点像记住有人在他的咖啡中放了多少糖,你不记得他喜欢吃1.1232汤匙糖,因为桌上的勺子在测量确切的食物量方面不是那么好它。你将它四舍五入到大多数时间都可以正常工作。

因此,对于浮点数,有一个类似的想法,有一个额外的扭曲 - 数字在0附近比远离它更密集,在它们之间的“空间”变得非常大。例如,如果从最大值中减去10000,则数字可以得到它仍然是相同的,因为没有数字接近它,它在寻找最接近的数字时会有所不同。

    trace (Number.MAX_VALUE == Number.MAX_VALUE-10000);
    //  returns "true"
    trace (200000 == 200000 - 10000);
    //  returns "false"

所以你的问题来自假设数字是完全精确的而不是,你总是把事情弄清楚。 as3中的数字遵循双精度IEEE-754标准,这就是它如何决定它具有哪个数字以及它的轮数。

看看这个:

trace (8244.094488188976);
// returns "8244.094488188975"

进一步阅读:

Floating point

IEEE_754-2008

答案 1 :(得分:0)

Adob​​e在名为Flash returns erroneous results for certain mathematical calculations的TechNote中的回复简明扼要地说:

  

这是使用浮点运算的应用程序中的事实。