【问题标题】:Visual Foxpro 9 Odd behaviour with large numeric valuesVisual Foxpro 9 具有大数值的奇怪行为
【发布时间】:2018-09-19 06:39:46
【问题描述】:

有人可以解释一下这种行为并提出解决方法吗?

在 VFP 9 的命令窗口中。

测试 1

a = 7003602346555440

?一个

显示正确的值。

测试 2

a = 7003602346555438

?一个

还不错。

测试 3

a = 7003602346555439

?一个

显示不正确的值 7003602346555440

测试 4

? a=7003602346555439

返回 .T。如你所料。

测试 5

?值(7003602346555439)

显示不正确的值 7003602346555440

将数字转换为文本表示以进行显示显然有些奇怪,但任何人都可以建议一种方法来避免这种情况并确保我始终获得正确的数字文本版本吗?

【问题讨论】:

  • 这似乎是由于数字精度。我不确定是否有解决方法

标签: visual-foxpro


【解决方案1】:

Source from this article

总结

Visual FoxPro 记录为具有 16 位精度。这是个 近似值:实际可精确表示的最大数是 9007199254740992 (2^53)。

更多信息

浮点数以 8 字节或 64 位表示形式存储。有 12 位开销,剩下 52 位来存储数字。还有一个 隐含位,最大值为 2^53。最大可数 Visual FoxPro 存储的是 2^1023。打印出来的二的最高幂 确切地使用 ?默认设置为 SET DECIMALS TO 2 的命令是 2^43。

以下代码演示了这一点:

将小数设置为 2 ? 2^43 && 显示所有数字
? 2^44 && 科学记数法

将小数设为 5
? 2^53 && 最大精确数

? 2^53 - 1 && 正确结果
? 2^53 + 1 && 结果不正确:浮点数舍入

? 2^1023 && 无法显示:* 将被打印
? 2^1022 && 可以显示

【讨论】:

    【解决方案2】:

    尽管文档说 val() 会在 16 位后四舍五入,但它通常会在 16 以上四舍五入。您展示的示例使用 16 位数字,这导致 val() 向上取整。

    【讨论】:

      猜你喜欢
      • 2019-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多