【问题标题】:SAS Getting Simple Calculation WrongSAS 简单计算错误
【发布时间】:2021-07-29 07:00:16
【问题描述】:

我不敢相信我以前从未遇到过这个问题(我也找不到其他有同样问题的人)但今天我刚刚发现 SAS 有时会出现简单的计算错误!?!我注意到我的一条记录没有根据值

code output

如果我将计算更改为 10 - 6.4,我会得到正确的值 3.6000,但由于某种原因,这个值是错误的。我的安装中可能有一些错误的疯狂设置吗?我尝试了 SAS EG 和 Base SAS,两者都有同样的问题。我感觉我快疯了!任何帮助表示赞赏。

谢谢。

【问题讨论】:

  • 您的发现是与数值的双精度表示相关的不幸但意料之中的情况。双精度可以达到小数点后 15 位或 16 位的精度。主题已在此处和许多其他场所进行了讨论。其他语言有其他表示形式,例如 BigDecimal 类,可以改善使用双精度时出现的一些“不精确”算术情况。最后,试试 SAS ROUND 函数,它在很多情况下都可以提供帮助。
  • 嗨 - 以后你能不能记住把代码和输出不是图片,而是文本?谢谢!
  • 啊,是的,每个程序员都会遇到的那一刻!对此现象的最佳解释之一是 Tom Scott:youtube.com/watch?v=PZRI1IfStY0
  • 谢谢,那个视频很有趣,很高兴知道!感谢大家的帮助,对图片感到抱歉

标签: sas


【解决方案1】:

任何语言的浮点运算都会有同样的问题。假设人类没有无限的概念,同样的问题可以用人类的术语来理解。例如,如果你只写下 4 位小数,那么:

1 - (1/3) - (1/3) - (1/3)

那是零,对吧?

1 - 0.3333 = 0.6667
0.6667 - 0.3333 = 0.3334
0.3334 - 0.3333 = 0.0001

不!计算机做同样的事情,但在二进制中,所以它们有一组不同的(和更大的)“问题”数字。例如,1/10 不能用二进制表示 - 所以加或减 0.1 并不总是像十进制那样是“整洁”的操作。

SAS 使用 8 字节浮点数,因此它的准确度约为 15 位。假设您不是在需要 15 位精度的领域工作,您应该简单地四舍五入。

if round(value,.01) ge 3.6 then ... ;

大多数时候这不是必需的,但严格来说,您应该始终在使用浮点数时比较四舍五入的数字(就像 SAS 所做的那样)。整数是安全的,但如果您使用 0.1 等,请使用 ROUNDFUZZ 作为整数。

【讨论】:

  • 非常感谢您的解释,很高兴知道我不会生气!
【解决方案2】:

抱歉,无法复制您的发现。

data x;
a=90-86.4;
run;

给出正确的结果。您是否使用任何格式或放置功能。分享完整代码。

【讨论】:

  • 您跳过了format 步骤,因此您的格式为best12. - 添加它会复制。 (无论哪种方式,请不要使用答案来制作 cmets - 如果它实际上没有回答问题,这将属于评论。)谢谢!
  • 请完成步骤。下面的步骤不会重现结果数据 x; a=90-86.4;格式一;运行;
  • 如果您运行 OP 发布的确切代码,它会重现。
  • 无论如何,即使您忽略他们发布的图片,您也可以自己进行简单的测试...data test; x = 90-86.4; if x = 3.6 then put "Success"; else put "Fail"; run; 即使不了解格式的工作原理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-27
相关资源
最近更新 更多