【问题标题】:Simple calculation problem with FlexFlex的简单计算问题
【发布时间】:2010-01-20 09:27:10
【问题描述】:

我在进行 flex 计算时遇到了问题,我正在尝试将像素值转换为 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。 我使用简单的 windows calc 跟踪了这个过程,它出错的第一个地方是 20940 / 2.54 = 8244.094488188975 应该是 8244,094488188976。

在这方面的任何帮助都会很棒。

【问题讨论】:

  • 每个计算机科学家都应该知道的浮点运算知识docs.sun.com/source/806-3568/ncg_goldberg.html
  • 我重新标记了这个以添加数学,我认为它的问题和答案会帮助其他人,希望这会导致更多的人看到它。

标签: apache-flex math floating-point


【解决方案1】:

好的,这不是一个关于一般编程的 Flex 问题。你有没有想过数字是如何存储在计算机中的?细节更多的是真正的数学,但我会尽量简单。您知道有无数种不同的实数(例如,像一条连续线上的点),但是在您的计算机中,您将所有内容存储为 0 和 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 中的 Number 遵循双精度 IEEE-754 标准,这就是它决定使用哪个数字以及舍入哪个数字的方式。

看看这个:

trace (8244.094488188976);
// returns "8244.094488188975"

进一步阅读:

Floating point

IEEE_754-2008

【讨论】:

  • 顺便说一句。一个快速的解决方法是将最终数字四舍五入到您需要的精度。毕竟,我认为您不在乎小数点后的第 15 个数字;)
  • 不确定我如何使用 Flex 做到这一点。感谢您的出色回答和解释。
  • @eldamar:如果您有一个数字n,请使用n.toPrecision(1) 获取包含该数字的字符串,保留一位小数。
【解决方案2】:

Adobe 在题为 Flash returns erroneous results for certain mathematical calculations 的技术说明中的回复简明扼要:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多