SAS字符型数值转数值型并保留全部小数位问题咨询
成因
- 输入格式宽度不足:使用
input(..., best.)时若未指定informat宽度,SAS默认采用12位宽度读取内容,你的示例字符转换为小数点格式后总长度远超12位,因此仅读取前12位内容,最终仅保留1位小数。 - 浮点数精度限制:SAS默认数值类型为双精度浮点数,最多可保证1517位有效数字的精度,你的示例数值整数部分已有10位,因此小数部分最多只能保留57位有效数字,超过该长度的部分会因精度不足丢失。
- 输出格式截断:你设置的输出格式为
20.14,仅会显示14位小数,本身也存在显示层面的截断,会让你误以为存储的小数位更少。 - 隐式转换规则限制:用字符串乘1做隐式转换时,SAS默认采用
best32.的informat读取,所以能读取更长的内容,比直接用默认best.保留的小数位更多,但仍受双精度精度限制。
调整方案
- 显式指定足够宽的输入格式,优先用显式
input转换而非隐式转换,同时设置足够宽的输出格式避免显示截断,示例代码如下:
data test; format CharVar $50. value_num 32.16; CharVar="7663229328,8184132475796"; value_num = input(tranwrd(CharVar,",","."), best32.); run;
- 若你的业务场景需要保留的有效数字超过16位,双精度浮点数无法完整存储,建议额外保留原始字符字段用于展示,数值字段仅用于计算,避免精度损失。
内容的提问来源于stack exchange,提问作者Shawnty
相关产品推荐
相关产品推荐

