我试图在 Stata 中舍入一个数字:
display round(1.015, .01)
这产生 1.01 而不是预期的 1.02
至少这是我所期望的(理解我的期望可能不符合 Stata 正在使用的某些标准)。
关于如何让Stata按照我的期望行事的任何建议?
最佳答案
Stata 使用数字的 double 或浮点表示(即基数 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 在其舍入模式(也称为打破平局)方面似乎非常安静。虽然它很可能使用 tie-up,但它也可以是 tie-to-even 或其他选项 - 最好不要依赖精确的中途行为,除非您能找到明确的规范。
关于rounding - Stata:舍入不正确?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32422691/