有人可以解释变量d4到d7中最高精度数的来源吗?
SAS计划:
data foo;
format d1-d7 datetime30.6;
timestring = "23:59:59.997000000";
time = input(timestring,time18.);
d1 = dhms(0,0,0,time);
d2 = dhms('08DEC1981'd,0,0,time);
d3 = dhms('31DEC2503'd,0,0,time);
d4 = dhms('31DEC2504'd,0,0,time);
d5 = dhms('08DEC2981'd,0,0,time);
d6 = dhms('08DEC4981'd,0,0,time);
d7 = dhms('08DEC9999'd,0,0,time);
run;
proc print;run;
输出:
Obs d1 d2 d3
1 01JAN1960:23:59:59.997000 08DEC1981:23:59:59.997000 31DEC2503:23:59:59.997000
Obs d4 d5 d6
1 31DEC2504:23:59:59.997002 08DEC2981:23:59:59.997002 08DEC4981:23:59:59.996994
Obs d7 timestring time
1 08DEC9999:23:59:59.997009 23:59:59.997000000 86400.00
答案 0 :(得分:2)
SAS日期时间值存储为自1960年1月1日以来的秒数,所以我很确定这是由使用二进制浮点数表示基数为10的数字的问题引起的。请参阅示例this article。
我现在无法访问SAS,所以我无法查看,但我例如,12月31日,2504,23:59:59:997将存储为17198611199.997。这里没有精度损失,因此当SAS将数字格式化回日期时间表示时会导致错误。
使用Python进行相同的计算
>>> from datetime import timedelta
>>> timedelta(seconds=17198611199.997)
datetime.timedelta(199057, 86399, 997002)
这是给定的秒数转换为199057天,86399秒和99702微秒。