Flex的简单计算问题

eld*_*mar 1 apache-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
Run Code Online (Sandbox Code Playgroud)

并计算回来:

Calculating pixel to MM from: 824.4094488188975
824.4094488188975/300 = 2.7480314960629917
2.7480314960629917 * 2.54 = 6.979999999999999
6.979999999999999 * 10 = 69.79999999999998
Run Code Online (Sandbox Code Playgroud)

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

Anny对此的帮助会很棒.

Rob*_*Bak 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"
Run Code Online (Sandbox Code Playgroud)

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

看这个:

trace (8244.094488188976);
// returns "8244.094488188975"
Run Code Online (Sandbox Code Playgroud)

进一步阅读:

浮点

IEEE_754-2008

  • @eldamar:如果你有一个数字`n`,使用`n.toPrecision(1)`得到一个包含该数字的字符串到一个小数位. (2认同)