(注意:此问题也发布了here)
看起来Stata的numlist
会将小数截断为13个无效数字。
program test
syntax, q(numlist)
disp "`q'"
if ( (`q' - 0.1234567890123456789) == 0 ) {
display "Stuff here should be executed"
}
else {
display "Stuff here should not be executed"
}
end
产生
. test, q(0.1234567890123456789)
.1234567890123
Stuff here should not be executed
有可能避免这种行为吗?当然我在我的程序中使用numlist,因为我也可以传递像q(0/10)
这样的东西等等。所以,例如,我遇到的现实问题是这样的:
foreach qq of numlist `=100 * 9090 / 100001'(`=100/100001')`=100 * 9092 / 100001' {
if ( (floor(`qq' * 99990 / 100) - `qq' * 99990 / 100) == 0 ) {
display "Stuff here should be executed if = to 0"
}
}
什么都没显示。但是,这是不正确的。
scalar s1 = `=100 * 9090 / 100001'
scalar s2 = `=100 * 9091 / 100001'
scalar s3 = `=100 * 9092 / 100001'
scalar comp1 = (floor(`=scalar(s1)' * 99990 / 100) - `=scalar(s1)' * 99990 / 100)
scalar comp2 = (floor(`=scalar(s2)' * 99990 / 100) - `=scalar(s2)' * 99990 / 100)
scalar comp3 = (floor(`=scalar(s3)' * 99990 / 100) - `=scalar(s3)' * 99990 / 100)
if ( `=scalar(comp1)' == 0 ) display "execute if comp1 == 0"
if ( `=scalar(comp2)' == 0 ) display "execute if comp2 == 0"
if ( `=scalar(comp3)' == 0 ) display "execute if comp3 == 0"
正确显示
execute if comp2 == 0
使用标量成功的numlist失败的原因是因为(100 * 9091/100001)是9.09 ...重复,而不是9.090909090909,这是numlist看到的(13位有效数字)。我们可以看到:
foreach qq of numlist `=100 * 9091 / 100001' {
disp %18.15f `qq'
}
disp %18.15f 9.090909090909
disp %18.15f (100 * 9091 / 100001)
可生产
9.090909090908999
9.090909090908999
9.090909090909092
第三个数字(我想要的那个)与另外两个不同。