我试图在 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/

10-12 20:19