SAS十进制精度和写入数据库

SAS十进制精度和写入数据库,sas,precision,Sas,Precision,你好 我遇到了这个问题,当时我正在向数据库中写入一些数字,在SAS中应该是值0.1,但由于一些奇怪的原因,在SQL数据库中显示为0.09。当我手动检查数据集时,它以12.2格式显示0.10 因此,我要做的是检查值是否实际为0.1或略低于此值: data _checking; set publish_data; if value < 0.1; dummy = value*10000000; run; 数据检查; 设置发布数据; 如果值

你好

我遇到了这个问题,当时我正在向数据库中写入一些数字,在SAS中应该是值
0.1
,但由于一些奇怪的原因,在SQL数据库中显示为
0.09
。当我手动检查数据集时,它以12.2格式显示
0.10

因此,我要做的是检查值是否实际为0.1或略低于此值:

data _checking;
    set publish_data;
    if value < 0.1;
    dummy = value*10000000;
run;
数据检查;
设置发布数据;
如果值<0.1;
虚拟=值*10000000;
跑
看来观测的数量满足了第一个条件。好啊这就解释了为什么值为0.09。取整问题

但是,所有的伪值都是整数。我试过10,100,1k,10k都是整数。(1,10,100…)

下一步我尝试:

data _checking2;
    set _checking;
    if dummy<10; /*Depending on the factorial*/
run; 
数据检查2;
设置检查;
假肢
  • 您可以尝试不同的格式。尝试
    32.31
    best32。
  • 减去
    0.1-值
    ,然后查看结果。同样,使用小数位数较多的格式
  • 您可能看不到
    dummy
    变量中的值,因为epsilon非常小,并且dummy仍在四舍五入显示

  • 尝试
    dummy=value*1e16
    或更高版本
  • SAS中的数字为C双精度,fwiw

  • 您可以尝试不同的格式。尝试
    32.31
    best32。
  • 减去
    0.1-值
    ,然后查看结果。同样,使用小数位数较多的格式
  • 您可能看不到
    dummy
    变量中的值,因为epsilon非常小,并且dummy仍在四舍五入显示

  • 尝试
    dummy=value*1e16
    或更高版本

  • SAS中的数字是C双精度,fwiw。

    答案1:

    查看实际值的最精确和最人性化的方法是使用
    HEX
    格式观察底层IEEE字节

    答案2:

    这些新虚拟变量的默认格式是
    BEST12.
    ,因此,如果它们小于BEST12,则不会看到任何小偏移。将显示或更精确地显示ε<1e-(12-log10(x))。在这种情况下,SAS格式可能被视为显示问题

    如果您的用例是“显示的”值必须是发送到远程数据库的实际值,那么在填充远程表之前,您将希望使用
    ROUND

    data x;
      x = 1/3; output;
      x = 0.1 - 1e-13; output;
      format x 12.2;
    run;
    
    data y;
      set x;
    
      put x= x= HEX16.;
    
      xhex = x;
      format xhex hex16.;
    
      array dummy dummy1-dummy13;
      do _n_ = 1 to 13;
        dummy(_n_) = x * 10**_n_;
      end;
    run;
    
    proc print data=y;
    run;
    
    data z;
      do p = 0 to 10;
      do q = 1 to 15;
        array z z1-z15;
        z(q) = 10**p + 10**-q;
      end; output;
      end;
      drop p q;
    run;
    
    ==== LOG ====
    x=0.33 x=3FD5555555555555
    x=0.10 x=3FB9999999997D74
    
    ==== PRINT ====
    Obs            x             xhex  dummy1  dummy2  dummy3  dummy4  dummy5    dummy6    dummy7
    
     1          0.33 3FD5555555555555 3.33333 33.3333 333.333 3333.33 33333.33 333333.33 3333333.33
     2          0.10 3FB9999999997D74 1.00000 10.0000 100.000 1000.00 10000.00 100000.00 1000000.00
    
    Obs    dummy8         dummy9          dummy10        dummy11         dummy12           dummy13
    
     1  33333333.33    333333333.33    3333333333.3    33333333333    333333333333    3.3333333E12
     2  10000000.00    100000000.00    1000000000.0    10000000000    100000000000    999999999999
    

    答案1:

    查看实际值的最精确和最人性化的方法是使用
    HEX
    格式观察底层IEEE字节

    答案2:

    这些新虚拟变量的默认格式是
    BEST12.
    ,因此,如果它们小于BEST12,则不会看到任何小偏移。将显示或更精确地显示ε<1e-(12-log10(x))。在这种情况下,SAS格式可能被视为显示问题

    如果您的用例是“显示的”值必须是发送到远程数据库的实际值,那么在填充远程表之前,您将希望使用
    ROUND

    data x;
      x = 1/3; output;
      x = 0.1 - 1e-13; output;
      format x 12.2;
    run;
    
    data y;
      set x;
    
      put x= x= HEX16.;
    
      xhex = x;
      format xhex hex16.;
    
      array dummy dummy1-dummy13;
      do _n_ = 1 to 13;
        dummy(_n_) = x * 10**_n_;
      end;
    run;
    
    proc print data=y;
    run;
    
    data z;
      do p = 0 to 10;
      do q = 1 to 15;
        array z z1-z15;
        z(q) = 10**p + 10**-q;
      end; output;
      end;
      drop p q;
    run;
    
    ==== LOG ====
    x=0.33 x=3FD5555555555555
    x=0.10 x=3FB9999999997D74
    
    ==== PRINT ====
    Obs            x             xhex  dummy1  dummy2  dummy3  dummy4  dummy5    dummy6    dummy7
    
     1          0.33 3FD5555555555555 3.33333 33.3333 333.333 3333.33 33333.33 333333.33 3333333.33
     2          0.10 3FB9999999997D74 1.00000 10.0000 100.000 1000.00 10000.00 100000.00 1000000.00
    
    Obs    dummy8         dummy9          dummy10        dummy11         dummy12           dummy13
    
     1  33333333.33    333333333.33    3333333333.3    33333333333    333333333333    3.3333333E12
     2  10000000.00    100000000.00    1000000000.0    10000000000    100000000000    999999999999
    

    SAS以二进制表示数字(使用IEEE浮点标准)。“尽管IEEE平台使用相同的规范集,但由于编译器差异和数学库差异,您可能偶尔会看到不同平台之间的不同结果”。SAS以二进制表示数字(使用IEEE浮点标准)。“尽管IEEE平台使用相同的规范集,但由于编译器差异和数学库差异,您可能偶尔会看到不同平台之间的不同结果”。