一個有趣的問題

s_111111 2008-07-09 09:50:42
CLEAR
Create Cursor AAA(A N(16,5))
Insert Into AAA(A) Values (2684.18000)
?Int(AAA.A*100000)
Create Cursor AAA(A N(16,5))
Insert Into AAA(A) Values (2685.18000)
?Int(AAA.A*100000)
大家猜猜結果是什么
...全文
121 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
s_111111 2008-07-17
  • 打赏
  • 举报
回复
小問題還是蠻多的呀
s_111111 2008-07-11
  • 打赏
  • 举报
回复
是INT()函數的一個BUG嗎,為什么還不改正他,都20年了
十豆三 2008-07-11
  • 打赏
  • 举报
回复
上面用ROUND是因为4舍5入了。
十豆三 2008-07-11
  • 打赏
  • 举报
回复
所以我还是认为是由处理器计算的造成的。
十豆三 2008-07-11
  • 打赏
  • 举报
回复
?str(9.2222,50,18)

如果是Int的Bug,这个又如何解释?
都市夜猫 2008-07-09
  • 打赏
  • 举报
回复
应该还是精度问题

v1 = 2684.18000
v2 = 2684.1800

? v1*100000, int(v1*100000)
? v2*100000, int(v2*100000)
十豆三 2008-07-09
  • 打赏
  • 举报
回复
x=1234567890.0987654321
? x

你的问题也这个差不多,是处理器计算的造成的。
s_111111 2008-07-09
  • 打赏
  • 举报
回复
但是我這個問題不是精度問題吧,他們長度都一樣,但結果不一樣。
結果是:268417999
268518000
表明他不是長度精度問題。
十豆三 2008-07-09
  • 打赏
  • 举报
回复
数字精度
当在 数值型 字段中存储浮点数字时,Visual FoxPro 中的数字精度被限定为大约 15 个阿拉伯数字。因此,当把十进制转换为二进制数、以二进制存储带有无限循环小数值的数字、执行多个重复运算,以及在 Character 字段和以二进制格式在内存变量中存储数字值时,超过 15 个阿拉伯数字的精度可能被丢失。

这个限制是基于 Pentium 系列处理器计算和存储浮点数的方式,并遵从了电机工程师协会(IEEE)以二进制格式操作浮点数字的浮点规范。这个标准使浮点数字以合理的空间数被存储并实现更快速的计算。

例如,分数 1/10 可以被表示为十进制值 0.1。然而,当以二进制存储 1/10 时,十进制值就不同于该分数了。相反,该分数是一个循环的二进制小数 0001100110011100110011 等等。这种数字类型不能在有限的内存中被表示,因此,当以二进制存储时,十进制值被四舍五入。

有关要求更高精度的值,请参见 双精度型字段类型。


有关浮点数字被存储和 Pentium 系列处理器如何处理它们的计算的更详细信息,请参见 http://support.microsoft.com/default.aspx?scid=kb;en-us;Q78113 上的 Microsoft Knowledge Base Article - Q78113, "XL: Floating-Point Arithmetic May Give Inaccurate Results"。

下面示例举例说明了 数值型 数据类型对于浮点数数字精度方面的限制:

复制代码
x=1234567890.0987654321
? x


结果是 1234567890.0987650000。
cbl518 2008-07-09
  • 打赏
  • 举报
回复
这是vfP 的 int() 函数,20 多年前就存在的一个问题!


用 ROUND 函数替代 INT 函数:
CLEAR
Create Cursor AAA(A N(16,5))
Insert Into AAA(A) Values (2684.18000)
?ROUND(AAA.A*100000,0)
Create Cursor AAA(A N(16,5))
Insert Into AAA(A) Values (2685.18000)
?ROUND(AAA.A*100000,0)
s_111111 2008-07-09
  • 打赏
  • 举报
回复
还是不很清楚,我看他并没有超过他的最大长度,小数位也没超过
就拿2685.18000和2684.18000比较,如果是精度问题的话,转换整形后应该都变才对。
2048.18000以1递增直到2684.18000之间的每个数乘以100000再转整形后,小数位都会变为17999,如果是精度问题的话该怎么解释

2,748

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧