具有大数值的Visual Foxpro 9奇数行为

时间:2018-09-19 06:39:46

标签: visual-foxpro

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

在VFP 9的命令窗口中。

测试1

a = 7003602346555440

?一个

显示正确的值。

测试2

a = 7003602346555438

?一个

还好。

测试3

a = 7003602346555439

?一个

显示不正确的值7003602346555440

测试4

? a = 7003602346555439

返回.T。如您所愿。

测试5

? VAL(7003602346555439)

显示不正确的值7003602346555440

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

2 个答案:

答案 0 :(得分:3)

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 &&可以显示

答案 1 :(得分:0)

即使文档说val()会在16位数字后四舍五入,但通常会在上面的处四舍五入。您显示的示例使用16位数字,这导致val()舍入。