我想在Stata中找一个数字:
display round(1.015, .01)
这产生1.01而不是预期的1.02
至少这是我所期望的(理解我的期望可能不符合Stata正在使用的某些标准)。
关于如何让Stata按照我的期望行事的任何建议?
答案 0 :(得分:9)
Stata使用数字的双重或浮点表示(即基数2不是数字10)。不幸的是,1.015在基数2中无法表示,因此它会达到最接近的值,在这种情况下略小于1.015,因此该回合下降。在处理计算机上的浮点精度时,这是一个常见问题 - 例如,请参阅Ruby中的这个问题:Ruby Float#round method behaves incorrectly with round(2)
那么你如何解决它?
如果3个小数位的精度对您很重要,则需要使用定点精度。我不相信Stata原生支持这个,但是很容易自己做:
display round(1015, 10)*0.001
即。您的输入数字乘以10 ^ 3,您显示的数字乘以10 ^ -3。因此,所有处理都以您感兴趣的小数位数的整数精度执行。
但请注意,看似等效的display round(1.015*1000, 0.01*1000)*0.001
不可以正常工作,因为在读取“1.015”时已经发生了基2舍入(即计算机将看到1.01499999。 .. * 1000 = 1014.999 ......)。当然,如果从其他地方获得值1.015,例如用户输入或读取文件,这也适用。
顺便说一句,Stata在其舍入模式(也称为打破平局)时似乎非常安静。虽然可能它使用捆绑,但它也可以是偶数或其他选项 - 最好不依赖于精确的中途行为,除非你能找到明确的规范